4

QWidget::winId的文档指出(除其他外)“如果一个小部件是非本地的(外星人)并且在其上调用了 winId,则该小部件将提供一个本地句柄。”

我不确定“外星人”在这种情况下是什么意思,但我现在选择忽略它。:)

因此,假设我的小部件现在有一个与之关联的有效本机句柄,那么我可以将该本机句柄传递给另一个进程并传递给QWidget::find并在第二个进程中获取一个有效的 QWidget 对象吗?

除了显示/隐藏它并将其附加到父小部件之外,我可能不需要在第二个过程中对小部件做太多其他事情。(保证不会在第一个进程中附加到任何父窗口小部件,并且在第一个进程的上下文中永远不可见)。

如果以上所有方法都有效:

  1. 第二个进程对该小部件有多少控制权?

  2. 第一个进程是否会像附加到第一个进程的 UI 一样接收用户输入事件,第一个进程是否能够正常更新小部件?

詹姆士

4

1 回答 1

2

让我们看一下 Qt 源码。

QWidget *QWidget::find(WId id)
{
    return QWidgetPrivate::mapper ? QWidgetPrivate::mapper->value(id, 0) : 0;
}

find()只有在mapper包含它时才能找到一个小部件。是mapper一个静态QHash<WId, QWidget *>变量。仅在QWidgetPrivate::setWinId方法中将项目插入此哈希中。

因此,如果带有 的小部件WId是在另一个进程中创建的,您无法使用QWidget::find. 此功能不使用任何本机操作系统功能来查找小部件。

另请参阅 Qt 文档中外星小部件的一般描述:

在 Qt 4.4 中引入的外星小部件是窗口系统未知的小部件。它们没有与之关联的本机窗口句柄。此功能显着加快了小部件的绘制、调整大小和消除闪烁。

于 2013-06-26T19:13:28.423 回答