qml加载方式包含三种,下面详细介绍每种方式以及区别:
- QQuickWidget
继承于QWidget,可以直接添加到Qt的布局当中,因涉及渲染到render到OpenGL帧缓冲区对象,会带来性能损失,性能稍低;禁用所有平台上的线程render loop,例如Animator类和vsync驱动的动画不能使用;避免在QQuickWidget上调用winId(),这个函数会触发本机窗口的创建,导致性能降低,并可能出现渲染问题 - QQuickView
继承自QQuickWindow(继承自QWindow),通过转换才能添加到Qt布局中 - QQmlApplicationEngine
只能用于qml相关的应用,本身不会创建任何可视化元素,需要手动往qml文件添加。如果你使用Qt Quick里面的元素item,你需要把qml里面加一个Window,然后加载进去。
示例:
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QWidget *mainWgt = new QWidget();
QHBoxLayout *mainLyt = new QHBoxLayout();
mainLyt->setSpacing(0);
mainLyt->setAlignment(Qt::AlignCenter);
mainLyt->setMargin(0);
mainWgt->setLayout(mainLyt);
//加载方式1--qml顶层不可为Window
QQuickWidget *pWgt = new QQuickWidget();
pWgt->setSource(QStringLiteral("qrc:/quickWidget.qml"));
mainLyt->addWidget(pWgt);
//加载方式2--qml顶层不可为Window
QQuickView *pView = new QQuickView();
pView->setSource(QStringLiteral("qrc:/quickView.qml"));
QWidget *wgt = QWidget::createWindowContainer(pView, nullptr);
wgt->setFixedSize(pView->size());
mainLyt->addWidget(wgt);
//加载方式3--qml顶层为Window
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/qmlApplicationEngine.qml")));
if (engine.rootObjects().isEmpty())
return -1;
mainWgt->show();
return app.exec();
}
运行效果:
代码链接:https://download.csdn.net/download/qqzhaojianbiao/19668474?spm=1001.2014.3001.5501