Перенос Qt и QML на qt5 и qt quick 2.1

Недавно мой руководитель назначил мне один порт Qt и qml. Наш старый проект работает над Qt 4.8 и использует Qt quick 1.0. В Qt4 QML изначально не предоставляет никаких элементов управления графическим интерфейсом по умолчанию, которые можно использовать при создании интерфейса для любой поддерживаемой им операционной системы. Чтобы сэкономить на создании элементов управления, нарисованных владельцем, мы решили использовать проект Qt Components for Desktop в качестве основы для всего нашего графического интерфейса для создания стандартного (и зависимого) внешнего вида на Qt4.8. Компоненты Qt переименованы в 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 и сохраняет указатель на своего родителя QWidget. MainWindow может динамически изменять меню. При щелчке по одному элементу меню будет создан один диалог, который определяется файлом qml или файлом Qt ui.

Теперь я закончил всю работу по изучению файла Qml, заменил компоненты Qt на QtQuick.Controls 1.0. Но я не знаю, как я использую QQmlApplicationEngine для загрузки моего файла и динамического изменения меню, загружаю вам виджет класса qt ui, использую QQuickWindow для загрузки нового файла qml и открытия нового окна.

Думаю, нам не нужно использовать этот виджет в моем новом проекте. Не могли бы вы мне помочь? Всем большое спасибо.


person bailizi    schedule 30.10.2013    source источник


Ответы (1)


В типичном приложении QtQuick у вас нет доступных функций QWidget. Это означает QMainWindow, QMenuBar или QMenu использовать нельзя, так как они наследуют QWidget.

Можно добавить меню 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")
        }
    }
}

В этом примере показан способ динамического добавления MenuItem с помощью Javascript в QML. Я просто не понял, как настроить какие-либо функции для новой записи меню, но я думаю, что это можно сделать с помощью свойства action MenuItem.

person Simon Warta    schedule 04.12.2013
comment
Да, ты прав. Вы должны определить действия, а затем назначить их действию MenuItem. Примерно так: // ... Действие {id: exitAction text: qsTr (Exit)} menuBar: MenuBar {Menu {title: qsTr (File) MenuItem {action: exitAction}}} // ... - person mhcuervo; 16.01.2014