- QWidget界面和QML窗口相互嵌套都是需要借助 quickwidgets 這個(gè)模塊中的類
- 我這里使用的是QQuickWidget谆级,這個(gè)類是繼承QWidget的弯淘,就和 QWidget 一樣使用就行
- 使用布局控制 控件 的位置
?
1. C++代碼
#include <QApplication>
#include <QtQuickWidgets/QQuickWidget>
#include <QQuickView>
#include <QHBoxLayout>
#include <QLabel>
int main(int argc, char *argv[])
{
// QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QWidget * widget = new QWidget;
widget->setWindowTitle("widget 主窗口");
widget->resize(800, 400);
// 設(shè)置布局
QHBoxLayout * layout = new QHBoxLayout;
layout->setContentsMargins(0, 0, 0 ,0);
widget->setLayout(layout);
// qml 界面 嵌入到 widget
QQuickWidget qmlWidget(QUrl("qrc:/main.qml"));
qmlWidget.setResizeMode(QQuickWidget::SizeRootObjectToView );
// 設(shè)置這個(gè)之后 anchor不用設(shè)置矮燎,root節(jié)點(diǎn)大小會(huì)根據(jù) QQuickWidget大小改變
// 在qml里 通過 parent 獲取不到 widget 窗口 !!!
layout->addWidget(&qmlWidget);
// widget 界面 嵌入到 qmlWidget里
QLabel label("QLabel", &qmlWidget);
label.move(100, 100);
// widget 界面 嵌入到 widget
QLabel nativeWidget;
nativeWidget.setText("Widget");
nativeWidget.setAlignment(Qt::AlignCenter);
layout->addWidget(&nativeWidget);
widget->show();
return app.exec();
}
?
2. QML代碼
- 這個(gè)QML代碼就隨便寫了一個(gè)簡單的 Rectangle
- 注意:如果是用 QQuickView或者QQuickWidget 加載的qml,root節(jié)點(diǎn)不能是 Window 這一類類型,最好是Rectangle
import QtQuick 2.9
Rectangle {
//visible: true
//width: 150
//height: 150
//anchors.fill: parent
//anchors.centerIn: parent
border.color: "#00ffd5"
border.width: 10
radius : 10
Text {
id : text
anchors.centerIn: parent
text: qsTr("QML Text")
antialiasing: true //抗鋸齒
}
// 旋轉(zhuǎn)動(dòng)畫
NumberAnimation {
id : numberAnimation
target: text
property: "rotation"
from: 0
to: 360
duration: 3000
running: true
loops: Animation.Infinite
}
}
?
3. 運(yùn)行效果
?
- 還有一點(diǎn)擅羞,Rectangle里不能放QWidget界面嚷堡,否則直接斷言退出程序
- ASSERT: "!d->isWidget" in file [kernel\qobject.cpp, line 1979](kernel\qobject.cpp, line 1979)