我的qt 5.9程序(在x11 linux上)使用QProcess
启动其他应用程序。
我想控制这些应用程序生成的窗口,因此我获取它们的winId
值,并使用QWindow::fromWinId
获取QWindow
实例。
问题是这些实例是无效的,不代表它们应该显示的窗口。
如果我使用winId
检查xwininfo
值,将返回正确的信息,因此我知道它们是好的。
我做错什么了?
编辑:举个例子没多大帮助,但可以这样说:
QProcess *process=new QProcess(this);
...
process.open()
... // wait until window appears
WId winId=PidToWid(process->processId()); // this function returns the Window ID in decimal format. I test this with xwininfo, it's always correct
...
QWindow *appWindow=QWindow::fromWinId(winId);
…基本上就是这样。AppWindow是一个有效的QWindow实例,但它与实际窗口没有任何关系。例如,如果我关闭它,它将返回true,但窗口不会关闭。
即使我故意提供了一个错误的wid,最终的结果也是一样的。
最佳答案
这不是正确的解决方案,解释为什么它应该工作,但它可能有助于某人…
当我使用qwindow从qt4 qx11mebeddedcontainer切换到qt5实现时,我的应用程序也遇到了同样的问题。我为解决/修复此问题所做的工作如下:
客户端应用程序:
widget->show(); //Widget had to be shown
widget->createWinId();
sendWinId(widget->winId()); //Post window handle to master app where is constructed container
主应用程序:
QWindow* window = QWindow::fromWinId(clientWinId);
window->show(); //This show/hide toggle did trick in combination with show in client app
window->hide();
QWidget* container = QWidget::createWindowContainer(window, parentWindowWidget);
在这之后,我能够通过qwidget容器正确地控制窗口。
关于linux - 无法使QWindow::fromWinId正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45061803/