我要求我的项目在其中一个屏幕上显示两个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()
也不会打开。现在,它显示一个空页面。
我的问题是:
答案 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事件