2

最近我的领导给我分配了一项 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和创建QDeclarativeViewmain.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 的指针QWidgetMainWindow可以动态修改菜单。单击一个菜单项时,将创建一个对话框,该对话框由 qml 文件或 Qt ui 文件定义。

现在我已经完成了所有 Qml 文件的研究工作,将 Qt 组件替换为 QtQuick.Controls 1.0。但我不知道如何使用QQmlApplicationEngine加载文件和动态修改菜单,加载你的 qt ui 类小部件,用于QQuickWindow加载新的 qml 文件以打开新窗口。

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

4

1 回答 1

1

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

要走的路是在以下位置附加一个 QML 菜单ApplicationWindow

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 中动态添加MenuItemusing Javascript 的方法。我只是不知道如何为新菜单项设置任何功能,但我认为这可以使用MenuItemaction的属性来完成。

于 2013-12-04T21:37:23.167 回答