QWidget :: find可以从不同的进程中查找小部件吗?

时间:2013-06-26 12:20:22

标签: qt qwidget

QWidget::winId州的文档(以及其他内容)“如果一个小部件是非本地的(外来的)并且在其上调用了winId,那么该小部件将被提供一个本机句柄。”

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

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

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

如果以上所有工作:

  1. 第二个进程对该小部件的控制程度是多少?

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

  3. 詹姆斯

1 个答案:

答案 0 :(得分: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找到它。此函数不使用任何本机OS函数来查找小部件。

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

  

在Qt 4.4中引入,外来小部件是未知的小部件   窗口系统。它们没有关联的本机窗口句柄   跟他们。此功能显着加快了小部件绘画,   调整大小,并消除闪烁。