Как положить 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 получает все события мыши без нажатия кнопки.
Я играл с фильтрами событий и повторными родительскими заданиями, но, похоже, никуда не денусь. У кого-нибудь был успех, пробующий что-то подобное?