2015-11-13 110 views
1

我有兴趣在我的QT 5.5 Widget应用程序中嵌入外部应用程序。我只关心它在Linux上的工作。我在GNOME上使用CentOS 7。QT 5.5将外部应用程序嵌入QWidget

这是我曾尝试代码:

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。要嵌入的应用程序正在运行。

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

那么是否有一种方法可以将应用程序嵌入到我的应用程序中?

*************** UPDATE ****************

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

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

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

+2

“但它不嵌入我的应用程序中的”你可以提供一个屏幕截图? – jpo38

回答

3

下达到预期的结果,关键是加入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); 
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其他选项。

+0

谢谢,我会看看这个项目。 –

+0

jpo38 - 感谢您的建议,我尝试了从您指向我的代码中提取的一些不同的东西。到目前为止,我还没有找到可行的方法。不过,我已经更新了我的原始POST和一些额外的信息。 –

+0

你有没有试图将'void QWinHost :: showEvent(QShowEvent * e)'代码复制到你的主窗口? (将子窗口移到正确的位置)。你试图改变子窗口样式来移除标题栏吗? – jpo38