【发布时间】:2013-10-30 03:04:22
【问题描述】:
最近我的领导给我分配了一项 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();
}
但是在我们的旧项目中,在主函数中,我们有一个MainWindow,它实现了主窗口,定位到main.qml,并以main.qml为源创建QDeclarativeView。
#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 并保持指向其父 QWidget 的指针。 MainWindow 可以动态修改菜单。单击一个菜单项会创建一个对话框,对话框由qml文件或Qt ui文件定义。
现在我已经完成了所有 Qml 文件的研究工作,将 Qt 组件替换为 QtQuick.Controls 1.0。但是我不知道怎么用QQmlApplicationEngine加载我的文件并动态修改菜单,加载你的qt ui类小部件,用QQuickWindow加载新的qml文件打开新窗口。
我认为我们不需要在我的新项目中使用小部件。你能给我一些帮助吗?非常感谢大家。
【问题讨论】: