最近我的领导给我分配了一项 Qt 和 qml 端口的工作。我们的旧项目是在 Qt 4.8 上工作并使用 Qt quick 1.0。在 Qt4 中,QML 本身不提供任何默认的 GUI 控件,以在它支持的任何操作系统的界面创建中使用。为了节省创建自绘控件的成本,我们选择使用 Qt Components for Desktop 项目作为我们所有 GUI 的基础,以在 Qt4.8 上创建 OS 标准(和依赖的)外观。Qt Components 被重命名为 Qt Quick Controls 并且是为 Qt5.x 开发的。Qt 组件提供菜单、工具栏、按钮。所以我删除了 Qt 组件,因为 Qt5.x 有 ApplicationWindow。
main.qml 文件:
import QtQuick.Controls 1.0
ApplicationWindow {
title: "My Application"
Button {
text: "Push Me"
anchors.centerIn: parent
}
}
Main.cpp 文件:
#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine("main.qml");
QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
if ( !window ) {
qWarning("Error: Your root item has to be a Window.");
return -1;
}
window->show();
return app.exec();
}
但是在我们的旧项目中,在 main 函数中,我们有一个MainWindow
实现主窗口,定位main.qml
和创建QDeclarativeView
的main.qml
源。
#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
……
}
在的构造函数中MainWindow
:
#include <QApplication>
#include <QQmlApplicationEngine>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
……
DeclarativeView* pView = new DeclarativeView;
setCentralWidget(pView);
……
}
Declarativeview 实现DeclarativeView
类,该类继承QDeclarativeView
并保持指向其 parent 的指针QWidget
。MainWindow
可以动态修改菜单。单击一个菜单项时,将创建一个对话框,该对话框由 qml 文件或 Qt ui 文件定义。
现在我已经完成了所有 Qml 文件的研究工作,将 Qt 组件替换为 QtQuick.Controls 1.0。但我不知道如何使用QQmlApplicationEngine
加载文件和动态修改菜单,加载你的 qt ui 类小部件,用于QQuickWindow
加载新的 qml 文件以打开新窗口。
我认为我们不需要在我的新项目中使用小部件。你能给我一些帮助吗?非常感谢大家。