无法让 QWindow::fromWinId 正常工作

Posted

技术标签:

【中文标题】无法让 QWindow::fromWinId 正常工作【英文标题】:Cannot get QWindow::fromWinId to work properly 【发布时间】:2017-07-12 15:22:46 【问题描述】:

我的 Qt 5.9 程序(在 X11 Linux 上)使用 QProcess 启动其他应用程序。 我想控制这些应用程序生成的 Windows,因此我获取了它们的 winId 值并使用 QWindow::fromWinId 来获取 QWindow 实例。

问题是这些实例是无效的,并不代表它们应该代表的窗口。

如果我使用xwininfo 检查winId 的值,则会返回正确的信息,因此我知道它们是好的。

我做错了什么?

编辑:一个例子不会有太大帮助,但这里是:

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 实例,但它与实际窗口没有任何关系。例如,如果我 close() 它,它会返回 true,但窗口不会关闭。

即使我故意提供了错误的 WId,最终结果也是一样的。

【问题讨论】:

不能马上判断,只要它可能是 X11 细节,但是:doc.qt.io/qt-5/qwidget.html#effectiveWinId 这没用,我正在尝试将外部程序的窗口转换为 QWindow 实例。正如文档中所述,这正是 QWindow::fromWinId 应该做的事情。 请出示minimal reproducible example。 其实没什么可展示的,但是我在原帖中添加了相关代码作为示例。 您仍然可以按照建议创建一个最小的可编译示例,尽管您的代码很大。您显示的代码还不够。 【参考方案1】:

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

当我使用 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 容器正确控制窗口。

【讨论】:

以上是关于无法让 QWindow::fromWinId 正常工作的主要内容,如果未能解决你的问题,请参考以下文章

无法让 UITableViewAutomaticDimension 正常工作

我无法让鼠标瞄准正常工作

无法让 webViewDidStartLoad 和 webViewDidFinishLoad 正常工作

我无法让 Cast Companion Library 通知正常工作

我无法让 Flutter 通知图标正常工作

无法让 MouseEnter(和类似命令)正常工作 [重复]