【问题标题】:QT 5.5 embed external application into QWidgetQT 5.5 将外部应用程序嵌入到 QWidget
【发布时间】:2016-02-15 10:03:44
【问题描述】:

我有兴趣在我的基于 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)。现在,如果我再次启动我的应用程序,第二个应用程序实际上已嵌入到我的容器应用程序中,这正是我想要的方式!

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

【问题讨论】:

  • “但是它没有嵌入到我的应用程序中”你能提供截图吗?

标签: c++ linux qt


【解决方案1】:

以下达到了预期的效果,关键是添加了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 以获取其他选项。

    【讨论】:

    • 谢谢,我会看看这个项目。
    • jpo38 - 感谢您的建议,我也尝试了从您指向我的代码中获取的一些不同的东西。到目前为止,我还没有找到有用的东西。不过,我已经用一些额外的信息更新了我原来的 POST。
    • 您是否尝试将void QWinHost::showEvent(QShowEvent *e) 代码复制到您的主窗口? (将子窗口移动到正确的位置)。例如,您尝试更改子窗口样式以删除其标题栏?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多