2015-07-08 7 views
4

У меня есть требование для моего проекта отображать два QML Window с каждого на одном из экрана (один отправитель, один приемник). Оба из .qml требуют от меня включить некоторые Cpp-модели внутри, я использую QQmlApplicationEngine для регистрации моделей Cpp.Несколько окон в одном проекте

Я узнал, что используя QWidget::createWindowContainer() Я могу отображать несколько Window s для одного проекта. Это отлично работает для первого файла QML. Фрагменты кода выглядит следующим образом:

QQmlApplicationEngine* engine = new QQmlApplicationEngine(Qurl("main.qml")); 
QmlContext* context = engine.getContextProperty(); 

//do some Cpp models registering... 

QQuickview *view = new QQuickview(engine,0); 
QWidget* container = widget::createWindowContainer(view); 
//I realized I dont need to do container->show(); for the main.qml to appear.. 

//use desktop widget to move the 2nd container to the 2nd screen... 

я решил создать 2-й двигатель приложения для моего receive.qml с подобным методом. Вскоре я понял, что receive.qml никогда не откроется даже с container2->show(). Теперь он показывает пустую страницу.

Мои вопросы:

  1. Является ли мой подход правильный или есть лучшее решение для этого?
  2. Какой сигнал мне нужно, чтобы поймать окно закрыть событие? Кажется, я не могу обнаружить сигнал, когда один из окон закрыт. так как я хотел закрыть их, когда был обнаружен .

ответ

6

Это можно сделать проще, например:

main.qml

import QtQuick 2.3 
import QtQuick.Window 2.2 

Item { 

    Window { 
     objectName: "wnd1" 
     visible: true 
    } 

    Window { 
     objectName: "wnd2" 
     visible: true 
    } 
} 

И так что вы можете получить доступ к этим окнам из кода С ++:

main.cpp

QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    QQuickWindow *wnd1 = engine.rootObjects()[0]->findChild<QQuickWindow *>("wnd1"); 
    if(wnd1) 
     wnd1->setTitle("Server"); 
    QQuickWindow *wnd2 = engine.rootObjects()[0]->findChild<QQuickWindow *>("wnd2"); 
    if(wnd2) 
     wnd2->setTitle("Client"); 

Чтобы поймать событие закрытия, вы должны использовать QQuickWindow::closing событие

+0

приятно! решение работает как шарм. кажется, что мы можем только 1 двигатель в любое время. Что касается сдвига второго окна на 2-й экран, Я получил доступную геометрию из qApplication :: desktop и установил x(), y() окна2 с помощью wnd2- > setX (..) & wnd2-> setY (..), чтобы получить нужную позицию. Можно ли установить x, y непосредственно через QQuickWindow? Или мне нужно использовать QObject :: setProperty? – angelhalo

+0

Обновление: от http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html кажется, что для установки X и Y рекомендуется использовать setProperty. Я приму этот метод. – angelhalo

+0

Вы можете использовать элемент [Screen] (http://doc.qt.io/qt-5/qml-qtquick-window-screen.html), чтобы настроить размер и положение в QML – folibis