将QWebEngineView添加到QStackedWidget或QTabWidget中导致切换按钮失效的解决方案

发布时间 2023-12-12 19:10:01作者: 一梦、

问题描述:将QWebEngineView添加到QStackedWidget或QTabWidget中导致切换按钮失效,如果只有两个来回切的话,是没有问题的,当出现多个页面的时候,就会切换失灵。

解决思路:将QWebEngineView浮到上面,只要实现大小、位置、显示隐藏与主页面同步即可。

 

QWebEngineView窗口构造窗口添加:

setWindowFlags(Qt::WindowStaysOnTopHint| Qt::ToolTip);

一、主窗口关键代码:

//态势感知
    m_CesiumMirrorWidget = new CesiumMirrorWidget();
    m_pCesium = new CesiumPlugin();


    //初始化中间容器
    ui.stackedWidget->addWidget(m_CesiumMirrorWidget);
    ui.stackedWidget->addWidget(m_pMidWidgetRWSL);
    ui.stackedWidget->addWidget(m_pMidWidgetFANZ);

    ui.stackedWidget->setCurrentWidget(m_CesiumMirrorWidget);
    m_pCesium->show();

其中m_CesiumMirrorWidget是用于占位置的假窗口,到时会被遮挡住,我称为镜像文件, m_pCesium是我的QWebEngineView窗口。

 

二、实时调整窗口的大小

void QtCommHtmlDemo::paintEvent(QPaintEvent *event) {
    if (ui.stackedWidget->currentWidget() == m_CesiumMirrorWidget) {
        QPoint pos = m_CesiumMirrorWidget->pos();
        QPoint globalPos = ui.stackedWidget->mapToParent(pos);
        if (isActiveWindow()) {
            if (m_pCesium) {
                m_pCesium->move(globalPos);
                m_pCesium->resize(m_CesiumMirrorWidget->size());
            }
        }
    }
}

 

三、根据事件更改显示隐藏

void QtCommHtmlDemo::changeEvent(QEvent *event) {
    if (event->type() == QEvent::ActivationChange) {
        if (isActiveWindow() || m_pCesium->isActiveWindow()) {
            //
        }else {
            if (m_pCesium) {
                m_pCesium->move(0, 0);
                m_pCesium->resize(1, 1);
            }
        }
    }
}

注:在页面之间切换时,只控制对应的m_pCesium->hide()、m_pCesium->show()即可。