2015-11-13 6 views
1

Я заинтересован в встраивании внешнего приложения в мое приложение на основе виджета QT 5.5. Я только занимаюсь этим, работая над Linux. Я использую CentOS 7 с GNOME.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 ****************

Кое-что интересное я просто раскрыл. Когда я запускаю приложение (приложение-контейнер), второе приложение (тот, который я хочу встроить) остается независимым окном за пределами моего приложения. Однако, если я изменил размер окна моего приложения (щелкните в правом нижнем углу, чтобы изменить размер окна), второе приложение (для встраивания) также изменится, но остается независимым окном за пределами моего контейнерного приложения.

Еще более интересно то, что если я убью свое приложение, оба приложения «исчезнут» с рабочего стола. Однако System Monitor показывает, что второе приложение (тот, который я хочу встроить) все еще работает (однако без 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

Он был разработан, чтобы встроить без СПОКОЙНЫЕ окна в QWidget на Windows. Но здесь могут быть некоторые трюки, которые вы можете получить отсюда, например, атрибуты, которые они устанавливают, чтобы окна были хорошо интегрированы друг с другом.

Например, вы можете попробовать это (от 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

Смежные вопросы