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

标签 c++ linux qt

我有兴趣在我的基于 QT 5.5 Widget 的应用程序中嵌入一个外部应用程序。我只关心它在 Linux 上的工作。我正在使用 CentOS 7 和 GNOME。

这是我试过的代码:

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)。现在,如果我再次启动我的应用程序,第二个应用程序实际上会按照我希望的方式嵌入到我的容器应用程序中!

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

最佳答案

下面达到了预期的效果,关键是添加了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);

关于c++ - QT 5.5 将外部应用程序嵌入到 QWidget 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33699258/

相关文章:

c++ - 如果 C++ 函数需要其他库,我该如何编译 "c++ functions from c"?

android - 如何在 Android 上使用 UID 获取用户名?

qt - 如何在QPushButton上设置图像?

c++ - 如何dlsym加载QString函数

c++ - 如何正确转换日期时间字符串的 utc 时间位移?

C++:非本地类型提升

c++ - 通过对基类的引用调用虚函数

c++ - 使用任意分隔符从 FileStream 读取

linux - 测试 NFS 性能的正确方法是什么

linux - head 是否消耗来自标准输入的额外字符?