我对将外部应用程序嵌入基于QT 5.5 Widget的应用程序感兴趣。我只关心它在Linux上的工作。我在GNOME上使用CentOS 7。
这是我尝试过的代码:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); QWindow *window = QWindow::fromWinId(125829124); QWidget *widget = QWidget::createWindowContainer(window); widget->setParent(this); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(widget); this->setLayout(layout); }
在此示例中,我将分别获取WinId,并仅对值进行硬编码以进行测试。要嵌入的应用程序正在运行。
当我执行我的应用程序时,它运行没有错误。并且要嵌入的应用程序会更改屏幕位置并调整其大小,但是不会嵌入到我的应用程序中。它仍然是一个单独的窗口。如果我杀死了我的应用程序,嵌入式应用程序也会被杀死。
那么有没有一种方法可以将应用程序实际嵌入到我的应用程序中呢?
**更新***
我刚刚发现了一些有趣的东西。当我运行我的应用程序(容器应用程序)时,第二个应用程序(我要嵌入的应用程序)在我的应用程序之外仍然是一个独立的Window。但是,如果我调整应用程序窗口的大小(单击右下角以调整窗口的大小),第二个要嵌入的应用程序也将调整大小,但是在我的容器应用程序之外仍然是一个独立的Window。
更加有趣的是,如果我杀死了我的应用程序,则两个应用程序都将从桌面“消失”。但是,系统监视器显示第二个应用程序(我要嵌入的应用程序)仍在运行(但是没有GUI)。现在,如果我再次启动我的应用程序,第二个应用程序实际上就是我想要的方式嵌入到我的容器应用程序中!
因此,我想我必须弄清楚为什么杀死我的应用程序然后重新启动它会正确地嵌入第二个应用程序。
以下达到了预期的结果,关键是添加了FramelessWindowHint:
QWindow *window = QWindow::fromWinId(211812356); window->setFlags(Qt::FramelessWindowHint); QWidget *widget = QWidget::createWindowContainer(window); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(widget); this->setLayout(layout);