QT 5.5如何将外部应用程序嵌入到QWidget中

10

我希望在我的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并将值硬编码进行测试。要嵌入的应用程序正在运行。

当我执行我的应用程序时,它没有错误。虽然要嵌入的应用程序更改了屏幕位置并调整大小,但它并没有嵌入到我的应用程序中。它仍然是一个独立的窗口。如果我关闭我的应用程序,则嵌入的应用程序也会被关闭。

那么有没有办法将应用程序实际嵌入到我的应用程序中呢?

*************** 更新 ****************

我刚刚发现一些有趣的事情。当我运行我的应用程序(容器应用程序)时,第二个应用程序(我想要嵌入的应用程序)仍然是一个独立的窗口,位于我的应用程序之外。但是,如果我调整我的应用程序窗口的大小(单击右下角以调整窗口大小),第二个应用程序(要嵌入的应用程序)也会调整大小,但仍然是一个独立的窗口,位于我的容器应用程序之外。

更有趣的是,如果我关闭我的应用程序,两个应用程序都会从桌面上“消失”。但是,系统监视器显示第二个应用程序(我想嵌入的应用程序)仍在运行(但没有GUI)。现在,如果我再次启动我的应用程序,则第二个应用程序实际上已嵌入到我的容器应用程序中,就像我想要的那样!

所以我想知道为什么关闭我的应用程序然后重新启动它会正确地嵌入第二个应用程序。


2
然而它并没有嵌入我的应用程序内。你能提供一张截图吗? - jpo38
2个回答

14

以下代码实现了所需的结果,关键在于添加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);

2
你应该查看这段代码:https://github.com/qtproject/qt-solutions/tree/master/qtwinmigrate/src。它旨在将非QT窗口嵌入到Windows上的QWidget中。但是,您可以从中学习一些技巧,例如他们设置的属性,使窗口之间的集成更加美观。
例如,您可以尝试使用以下代码(来自qwinwidget.cpp):
QEvent e(QEvent::EmbeddingControl);
QApplication::sendEvent(widget, &e);

如果这不起作用,检查qwinwidget.cpp和qwinhost.cpp以获取其他选项。

谢谢,我会查看这个项目。 - dan poder
jpo38 - 感谢您的建议,我尝试了一些从您指向的代码中获取的不同方法。到目前为止,我还没有找到有效的方法。但是,我已经更新了我的原始POST,并添加了一些附加信息。 - dan poder
1
你尝试过将 void QWinHost::showEvent(QShowEvent *e) 代码复制到你的主窗口中吗?(以将子窗口移动到正确的位置)。你是否尝试更改子窗口的样式,例如删除它的标题栏? - jpo38

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接