Как положить QQuickWidget (с прозрачностью) поверх QWidget

Я пытаюсь использовать QQuickWidget в качестве наложения поверх QWidget. QQuickWidget содержит несколько кнопок и пару других виджетов, расположенных вдоль нижней части.

Я обнаружил, что я могу получить QQuickWidget для правильного наложения QWidget, используя комбинацию setAttribute(Qt::WA_AlwaysStackOnTop) и setClearColor (Qt:: transparent). Но проблема, с которой я столкнулся, заключается в том, что все события мыши направляются в главное окно вместо основного QWidget.

Я настроил пример проекта, чтобы воспроизвести мою проблему.

OverlayItem.qml определяется следующим образом:

import QtQuick 2.6
import QtQuick.Controls 1.4

Item {
    width: parent.width
    height: parent.height

    Row {
        anchors { 
            horizontalCenter: parent.horizontalCenter; 
            bottom: parent.bottom; 
            bottomMargin: 15 
        }
        spacing: 15
        Button {
            text: "Button1"
            onClicked: {
                console.log("Button1 CLICKED!")
            }
        }
        Button {
            text: "Button2"
            onClicked: {
                console.log("Button2 CLICKED!")
            }
        }
        Button {
            text: "Button3"
            onClicked: {
                console.log("Button3 CLICKED!")
            }
        }
    }
}

QQuickWidget создается и QML загружается при создании MainWindow:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    qw(NULL)
{
    ui->setupUi(this);

    qw = new QQuickWidget(ui->frame);
    qw->setResizeMode(QQuickWidget::SizeRootObjectToView);
    qw->setAttribute(Qt::WA_AlwaysStackOnTop);
    qw->setClearColor(Qt::transparent);
    qw->setSource(QUrl("OverlayItem.qml"));
}

void MainWindow::showEvent(QShowEvent *event)
{
    if (auto pw = qw->parentWidget())
    {
        qw->resize(pw->size());
    }
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    if (auto pw = qw->parentWidget())
    {
        qw->resize(pw->size());
    }
}

А вот код интерфейса MainWindow:

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QGridLayout *gridLayout_2;
    QFrame *frame;
    QGridLayout *gridLayout;
    QTextBrowser *textBrowser;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QStringLiteral("MainWindow"));
        MainWindow->resize(800, 600);

        QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(0);
        sizePolicy.setHeightForWidth(MainWindow->sizePolicy().hasHeightForWidth());
        MainWindow->setSizePolicy(sizePolicy);

        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QStringLiteral("centralWidget"));

        gridLayout_2 = new QGridLayout(centralWidget);
        gridLayout_2->setSpacing(6);
        gridLayout_2->setContentsMargins(11, 11, 11, 11);
        gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));

        frame = new QFrame(centralWidget);
        frame->setObjectName(QStringLiteral("frame"));
        frame->setFrameShape(QFrame::StyledPanel);
        frame->setFrameShadow(QFrame::Raised);

        gridLayout = new QGridLayout(frame);
        gridLayout->setSpacing(6);
        gridLayout->setContentsMargins(11, 11, 11, 11);
        gridLayout->setObjectName(QStringLiteral("gridLayout"));

        textBrowser = new QTextBrowser(frame);
        textBrowser->setObjectName(QStringLiteral("textBrowser"));
        textBrowser->setReadOnly(false);

        gridLayout->addWidget(textBrowser, 0, 0, 1, 1);

        gridLayout_2->addWidget(frame, 0, 0, 1, 1);

        MainWindow->setCentralWidget(centralWidget);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi
};

Как вы можете видеть, CentralWidget содержит QFrame, который, в свою очередь, содержит QTextBrowser. Желаемое поведение этого примера кода для QTextBrowser, чтобы оставаться функциональным, в то время как 3 кнопки наложены внизу. Однако когда я запускаю этот код, я не могу щелкнуть QTextBrowser, чтобы выделить его. Вместо этого MainWindow получает все события мыши без нажатия кнопки.

Я играл с фильтрами событий и повторными родительскими заданиями, но, похоже, никуда не денусь. У кого-нибудь был успех, пробующий что-то подобное?

0 ответов

Другие вопросы по тегам