单个项目中的多个窗口

时间:2015-07-08 16:47:14

标签: qt qml qwidget qtquick2 qquickview

我要求我的项目在其中一个屏幕上显示两个QML Window(一个发送者,一个接收者)。两个.qml都要求我在里面包含一些Cpp模型,我使用QQmlApplicationEngine来注册Cpp模型。

我发现使用QWidget::createWindowContainer()我可以为单个项目显示多个Window。这适用于第一个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...

我决定使用类似的方法为receive.qml创建第二个应用程序引擎。我很快意识到receive.qml即使用container2->show()也不会打开。现在,它显示一个空页面。

我的问题是:

  1. 我的方法是正确的还是有更好的解决方案?
  2. 我需要注意什么信号来关闭窗户 事件?其中一个似乎无法检测到信号 窗户关闭了。因为我想要关闭两者 检测。

1 个答案:

答案 0 :(得分:12)

这可以更容易,例如:

<强> main.qml

#include <vector>
#include <string>

void SendInputString(const std::wstring &str)
{
    int len = str.length();
    if (len == 0) return;

    std::vector<INPUT> in(len*2);
    ZeroMemory(&in[0], in.size()*sizeof(INPUT));

    int i = 0, idx = 0;
    while (i < len)
    {
        WORD ch = (WORD) str[i++];

        if ((ch < 0xD800) || (ch > 0xDFFF))
        {
            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = ch;
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx] = in[idx-1];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;
        }
        else
        {
            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = ch;
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = (WORD) str[i++];
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx] = in[idx-2];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;

            in[idx] = in[idx-2];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;
        }
    }

    SendInput(in.size(), &in[0], sizeof(INPUT));
}

因此您可以从C ++代码访问这些窗口:

<强>的main.cpp

import QtQuick 2.3
import QtQuick.Window 2.2

Item {

    Window {
        objectName: "wnd1"
        visible: true
    }

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

要捕捉结束事件,您应该使用QQuickWindow::closing事件