QWidget::winId州的文档(以及其他内容)“如果一个小部件是非本地的(外来的)并且在其上调用了winId,那么该小部件将被提供一个本机句柄。”
我不确定“外星人”在这种情况下意味着什么,但我现在选择忽略它。 :)
假设我的小部件现在有一个与之关联的有效本机句柄,那么我可以将该本机句柄传递给另一个进程并进入QWidget::find并在第二个进程中获取有效的QWidget对象吗?
除了显示/隐藏它并将其附加到父窗口小部件之外,我可能不需要在第二个过程中对窗口小部件做太多其他操作。 (它保证不会在第一个进程中附加到任何父窗口小部件,并且在第一个进程的上下文中永远不可见。)
如果以上所有工作:
第二个进程对该小部件的控制程度是多少?
第一个进程是否会接收用户输入事件,就像它已附加一样 到第一个进程的UI,第一个进程是否能够正常更新小部件?
詹姆斯
答案 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中引入,外来小部件是未知的小部件 窗口系统。它们没有关联的本机窗口句柄 跟他们。此功能显着加快了小部件绘画, 调整大小,并消除闪烁。