【问题标题】:Port Qt and QML to qt5 and qt quick 2.1将 Qt 和 QML 移植到 qt5 和 qt quick 2.1
【发布时间】: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文件打开新窗口。

我认为我们不需要在我的新项目中使用小部件。你能给我一些帮助吗?非常感谢大家。

【问题讨论】:

    标签: qt qml qt-quick qtquick2


    【解决方案1】:

    在典型的 QtQuick 应用程序中,您没有任何可用的 QWidget 功能。这意味着不能使用QMainWindow、QMenuBar 或QMenu,因为它们继承了QWidget。

    要走的路是在ApplicationWindow 中附加一个 QML 菜单:

    import QtQuick 2.1
    import QtQuick.Controls 1.0
    
    ApplicationWindow {
        title: "My Application"
        menuBar: MenuBar {
            Menu {
                id: menuA
                title: "Menu A"
    
                MenuItem {
                    text: "Hello 1"
                }
                MenuItem {
                    text: "Hello 2"
                }
            }
            Menu {
                title: "Menu B"
    
                MenuItem {
                    text: "Hello 3"
                }
                MenuItem {
                    text: "Hello 4"
                }
            }
    
            Component.onCompleted: {
                var newMenuItem = menuA.addItem("bla")
            }
        }
    }
    

    这个例子展示了一种在 QML 中使用 Javascript 动态添加 MenuItem 的方法。我只是没有弄清楚如何为新菜单项设置任何功能,但我认为这可以使用MenuItem 的action 属性来完成。

    【讨论】:

    • 是的,你是对的。您必须定义操作,然后将它们分配给 MenuItem 的操作。像这样: // ... Action { id: exitAction text: qsTr("Exit") } menuBar: MenuBar { Menu { title: qsTr("File") MenuItem { action: exitAction } } } // ...
    猜你喜欢
    • 2013-11-10
    • 2023-03-14
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多