无法让QWindow :: fromWinId正常工作

时间:2017-07-12 15:22:47

标签: linux qt x11

我的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,最终结果也一样。

1 个答案:

答案 0 :(得分:0)

这不是解释为什么它应该起作用的正确解决方案,但它对某些人可能有帮助......

当我使用QWindow从Qt4 QX11EmebeddedContainer切换到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容器正确控制窗口。