我有兴趣在我的基于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);
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我分别得到WinId,只是对测试值进行硬编码.要嵌入的应用程序正在运行.
当我执行我的应用程序时,它运行没有错误.要嵌入的应用程序会更改屏幕位置并调整大小,但它不会嵌入到我的应用程序中.它仍然是一个单独的窗口.如果我杀了我的应用程序,嵌入式应用程序也会被杀死.
那么有没有办法在我的应用程序中实际嵌入应用程序?
***************更新****************
我刚刚发现了一些有趣的东西.当我运行我的应用程序(容器应用程序)时,第二个应用程序(我想嵌入的应用程序)仍然是我的应用程序之外的独立窗口.但是,如果我调整应用程序窗口的大小(单击右下角以调整窗口大小),第二个应用程序(要嵌入)也会调整大小,但仍然是容器应用程序之外的独立窗口.
更有趣的是,如果我杀死我的应用程序,两个应用程序都会从桌面"消失".但是,系统监视器显示第二个应用程序(我想要嵌入的应用程序)仍在运行(但没有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);
Run Code Online (Sandbox Code Playgroud)