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

时间:2015-11-13 18:12:50

标签: c++ linux qt

我有兴趣在我的基于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,只是对测试值进行硬编码。要嵌入的应用程序正在运行。

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

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

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

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

更有意思的是,如果我杀了我的应用程序,两个应用程序都会消失#34;从桌面。但是,系统监视器显示第二个应用程序(我想要嵌入的应用程序)仍在运行(但没有GUI)。现在,如果我再次启动我的应用程序,第二个应用程序实际上是嵌入我的容器应用程序中,就像我想要的那样!

所以我想我必须弄清楚为什么要杀死我的应用程序然后重新启动它会正确嵌入第二个应用程序。

2 个答案:

答案 0 :(得分:6)

以下实现了预期的结果,关键是添加了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);

答案 1 :(得分:0)

您应该查看以下代码: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以获取其他选项。