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

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

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

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

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

如果以上所有工作:

>第二个进程对该窗口小部件的控制程度是多少?
>第一个进程是否会接收用户输入事件,就像它已附加一样
到第一个进程的UI,第一个进程是否能够正常更新小部件?

詹姆士

最佳答案 我们来看看Qt的来源.

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

find()只有在mapper包含它时才能找到它.映射器是静态QHash< WId,QWidget *>变量.仅在QWidgetPrivate :: setWinId方法中将项插入此哈希中.

因此,如果在另一个进程中创建了带有WId的窗口小部件,则无法使用QWidget :: find找到它.此函数不使用任何本机OS函数来查找小部件.

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

Introduced in Qt 4.4, alien widgets are widgets unknown to the
windowing system. They do not have a native window handle associated
with them. This feature significantly speeds up widget painting,
resizing, and removes flicker.

点赞