Overlay Issue between QWebView and QOpenGL widget
-
I am trying to develop an application where I am loading an html page on QWebView and drawing a QOpenGLWidget on top of that to display few important graphic information.
Facing few overlay issues to achieve this.The set up looks good when I use "setAttribute( Qt::WA_AlwaysStackOnTop)" attribute. But the problem starts when I use dropdowns or popovers from my html page on top of the widget.
When I use html elements like drop-down(for example to select from a list of tools available) both the graphic item and the drop-down appear simultaneously(assuing WA_AlwaysStackOnTop is set).
My requirement is to have the components like drop-down opaque so that whenever I have a drop-down on my html page, the graphics on the widget is not visible only for that particular region.Tried out different options, seems like nothing works.
Given below is a brief account of what I am doing
MainWindow::MainWindow(QWidget parent) :
QMainWindow(parent)
{
QDesktopWidget desktopWidget = QApplication::desktop();
QRect screenRect = desktopWidget->screenGeometry();MAX_y = screenRect.height(); MAX_x = screenRect.width(); this->setFixedSize(MAX_x , MAX_y); wv = new QView(this); wv->setGeometry(0,0,this->width(), this->height()); wv->loadPage(QUrl::fromLocalFile("/../.../xxx.html"));
}
MainWindow::~MainWindow()
{
}QView::QView(QWidget *parent) :
QWebView(parent)
{
QObject::connect(this, SIGNAL(loadFinished(bool)), this, SLOT(pageLoaded(bool)));
viewer = new Viewer(parent, queue);
QPalette palette = this->palette();
palette.setBrush(QPalette::Base, Qt::transparent);
this->page()->setPalette(palette);
this->setAttribute(Qt::WA_OpaquePaintEvent, false);
}QView::~QView() {
}void QView::loadPage(QUrl url) {
this->load(url);
QObject::connect(this->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(populateJavaScriptWindowObject()));
}void QView::pageLoaded(bool isOK) {
this->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); this->page()->mainFrame()->evaluateJavaScript("setup()"); // For Testing purpose only. setViewerPosition can be triggered from JavaScript layer. setViewerPosition(40,360,700,600);
}
void QView::populateJavaScriptWindowObject() {
this->page()->mainFrame()->addToJavaScriptWindowObject("jsbridge", this);
}void QView::setViewerPosition(int x, int y, int w, int h) {
viewer->move(x, y);
viewer->resize(w, h);
viewer->show();
viewer->refresh();
}Viewer::Viewer(QWidget parent) :
QOpenGLWidget(parent)
{
QDesktopWidget desktopWidget = QApplication::desktop();
m_ScreenRect = desktopWidget->screenGeometry();
MAX_Y = m_ScreenRect.height();
MAX_X = m_ScreenRect.width();
layout = new ViewerLayout(2, 4, MAX_X/2, MAX_Y/2);
setAttribute( Qt::WA_AlwaysStackOnTop);
}Viewer::~Viewer()
{
delete layout;
}