Qt嵌入并展示其他程序的疑问!

caoxuan 2017-07-10 02:01:55
大家好,目前正在做的项目需要用QT作为外壳,嵌入一个完全独立的exe(其他语言编写)。遇到了一个exe展示的问题,通过Qt外壳上的按钮点击启动exe,启动完成后使用createWindowContainer嵌入,由于不知道exe具体启动耗时,所以采用的方法是Qt程序与内嵌exe用消息通信,exe启动完成后给Qt发送消息,执行内嵌。 具体代码:
WId wid = (WId)FindWindow(L"WindowsForms10.Window.8.app.0.141b42a_r9_ad1", NULL);
QWindow *m_window;
m_window = QWindow::fromWinId(wid);
widget_Main = QWidget::createWindowContainer(m_window,this);
this->setCentralWidget(widget_Main);
出现的问题是:exe启动了但是无法嵌入Qt,或者嵌入了但是界面上未显示,我没太弄明白。但是如果不用发送消息方式,在Qt上多放一个按钮,点击按钮执行上述代码,则正常将exe嵌入Qt外壳并展示。
请问各位,发送消息的方式与手动点击按钮的方式有什么区别,发送消息的方式如何能正确显示内嵌的exe,小弟刚学qt,对一些机制不太明白,请大家帮忙,谢谢!
...全文
535 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
TimiWang 2017-11-23
  • 打赏
  • 举报
回复
你好,我也有相似需求。你的问题解决了吗,能请教一下是怎么解决的吗?
TimiWang 2017-11-23
  • 打赏
  • 举报
回复
不用了 我解决了。
大卫无限 2017-07-11
  • 打赏
  • 举报
回复


    QProcess::startDetached("notepad.exe");
    WId wid = 0;
    do
    {
        QEventLoop loop;
        QTimer::singleShot(1, &loop, SLOT(quit()));
        loop.exec();

        wid = (WId)FindWindowW(L"Notepad", NULL);
    }while(wid == 0);

    QWindow *m_window;
    m_window = QWindow::fromWinId(wid);
    QWidget *widget_Main = QWidget::createWindowContainer(m_window,this);
    this->setCentralWidget(widget_Main);

加延时可以工作哦.
Acuity. 2017-07-10
  • 打赏
  • 举报
回复
来个qt多进程?
caoxuan 2017-07-10
  • 打赏
  • 举报
回复
引用 6 楼 u011330815 的回复:
请问你启动的exe和Qt程序有什么交互吗?
有些参数需要传过去,这些参数可以在嵌入之后发消息通知,现在主要问题是我确定不了exe启动耗时,以及弄不明白点击按钮和发送消息执行同一段代码有什么区别。我理解点击按钮可能执行了一些父类的方法,但是在代码里直接使用ui.pushButton_3->click();还是不行
你的OPPA 2017-07-10
  • 打赏
  • 举报
回复
请问你启动的exe和Qt程序有什么交互吗?
caoxuan 2017-07-10
  • 打赏
  • 举报
回复
引用 4 楼 zp_lhy 的回复:
WId wid = (WId)FindWindow(L"WindowsForms10.Window.8.app.0.141b42a_r9_ad1", NULL); 这句执行结果不为空应该就说明完全启动了吧,还要exe发送消息去告知吗?
哦,是我代码没有贴全, bool bRet = CreateProcess( NULL, (LPWSTR)cmd.toStdWString().c_str(), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); 这是启动exe的代码,然后需要等待exe启动完成执行 WId wid = (WId)FindWindow(L"WindowsForms10.Window.8.app.0.141b42a_r9_ad1", NULL); 启动代码和查找窗口的代码之间需要等待exe启动完成才行吧?
zp_lhy 2017-07-10
  • 打赏
  • 举报
回复
WId wid = (WId)FindWindow(L"WindowsForms10.Window.8.app.0.141b42a_r9_ad1", NULL); 这句执行结果不为空应该就说明完全启动了吧,还要exe发送消息去告知吗?
caoxuan 2017-07-10
  • 打赏
  • 举报
回复
引用 1 楼 u011330815 的回复:
Qt走的是信号槽机制,你点击按钮响应对应的槽函数,在该槽函数中去调用exe就行了
你好,启动exe和内嵌exe是两个功能,如果放到一个信号槽中,我还是不能确定exe的启动耗时,执行启动之后无法确定多长时间之后执行内嵌操作啊
你的OPPA 2017-07-10
  • 打赏
  • 举报
回复
如果你需要exe和Qt之间有交互,那就多写个网络进行通信吧
你的OPPA 2017-07-10
  • 打赏
  • 举报
回复
Qt走的是信号槽机制,你点击按钮响应对应的槽函数,在该槽函数中去调用exe就行了

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧