Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
#1

Встраивание программы в окно приложения qt

02.03.2016, 12:16. Просмотров 1237. Ответов 6
Метки нет (Все метки)

Подскажите, пожалуйста!

Можно ли внешнее приложение не просто запускать QProcess`ом, а встроить его в свое окно?

В Qt4 был для этого QX11EmbedContainer.

А как делать в Qt5?

Вот хорошая ссылка:
https://forum.qt.io/topic/32785/qwindow-qwidget-qt5-x11embedding-how

Но что-то мне не помогло((

Пробую использовать createWindowContainer.
Создаю виджет wi, получаю его WId, а из него получаю QWindow *myWindow.
В лайаут окна приложения вставляю QWidget* widget = QWidget::createWindowContainer(myWindow);

C++ (Qt)
1
2
3
4
5
6
7
    wi->show();
    WId wid = wi->winId();
    QWindow* myWindow = QWindow::fromWinId(wid);
 
    QWidget* widget = QWidget::createWindowContainer(myWindow);
    widget->setMaximumSize(100,100);
    ui->horizontalLayout_2->addWidget(widget);
В итоге работает через раз (почему?), да еще и не так, как надо.
То есть окно первого виджета остается существовать, но его содержимое (кнопочка у меня) отсутствует - она появляется в окне приложения. Как избавиться от оставшегося пустого окошка непонятно.

Кто-нибудь пользовался createWindowContainer?
Поделитесь рабочим примером, пожалуйста!

Ну и можно ли как-то дальше внешнее приложение осилить...

Вот еще полезная ссылка
https://bugreports.qt.io/browse/QTBUG-44404

Всем заранее спасибо!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2016, 12:16
Ответы с готовыми решениями:

Главное окно приложения
Всем Доброго времени суток! Прошу помощи в создании главного окна приложения....

Спрятать окно при запуске приложения
Необходимо запустить программу, но, чтобы главная форма находилась в скрытом...

Не выводится изображение в окно программы
Имеет место быть такая проблема. Недавно начал читать мануал по Qt, где был...

Встраивание интерфейса в видео поток
Дорогие форумчане, здравствуйте! Я пока не знаю, вопрос этот из области...

Как разместить окно mainWindow при запуске программы внизу справа?
Как разместить окно mainWindow при запуске программы внизу справа?

6
OneMoreGres
70 / 70 / 32
Регистрация: 07.11.2015
Сообщений: 281
03.03.2016, 20:57 #2
Быдлокод, но как-то так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
QProcess *calcProc  = new QProcess;
calcProc->start ("xcalc");
if (calcProc->waitForStarted ()) {
  calcProc->waitForReadyRead (100); // just for timeout
  QProcess proc;
  proc.start ("xwininfo", QStringList () << "-int" << "-name" << "Calculator");
  proc.waitForReadyRead ();
  QByteArray in = proc.readAllStandardOutput ();
  qDebug () << in;
  proc.close ();
 
  int beg = in.indexOf ("id: ") + 4;
  int end = in.indexOf (" \"Calc");
  QByteArray wId = in.mid (beg, end-beg);
 
  QWindow *win = QWindow::fromWinId (WId(wId.toInt ()));
  QWidget *cont = QWidget::createWindowContainer (win, NULL);
  ui->widget->layout ()->addWidget (cont);
}
2
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
05.03.2016, 00:54  [ТС] #3
Цитата Сообщение от OneMoreGres Посмотреть сообщение
proc.start ("xwininfo", QStringList () << "-int" << "-name" << "Calculator");
Вот за это просто гигантское спасибо!

Но, к сожалению, то же самое. Изредка встраивается. В большинстве случаев остается отдельным окном.
Qt 5.3.
0
lell3
1 / 1 / 0
Регистрация: 29.08.2016
Сообщений: 43
07.08.2017, 17:26 #4
Так чем закончилось все? Получилось это реализовать в Qt5 ??
0
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
07.08.2017, 22:30  [ТС] #5
Цитата Сообщение от lell3 Посмотреть сообщение
Так чем закончилось все?
Эпикфэйл
Не получилось, емнип, это зависит от оконного менеджера.
0
Байт
Эксперт C
17943 / 11933 / 2479
Регистрация: 24.12.2010
Сообщений: 24,043
07.08.2017, 22:56 #6
traktort, вызываемое приложение оконное или консольное?
0
lell3
1 / 1 / 0
Регистрация: 29.08.2016
Сообщений: 43
08.08.2017, 11:52 #7
Цитата Сообщение от traktort Посмотреть сообщение
Не получилось, емнип, это зависит от оконного менеджера.
На просторах интернета нашел твои темы, посещенные данному вопросу. Ты хотела в Qt приложение вставить разные другие программы (несколько калькуляторов). Для этого есть ActiveQt. В готовых примерах есть примеры, где вставляется Exel на QWidget.

У меня немного другая задача. Есть gui приложение на Delphi, мне нужно написать на Qt библиотеку, которое получает id
элемента gui delphi и на нем рисует картинку.
Ты, как человек который плотно занимался этим вопрос, может что-нибудь посоветуешь...

Добавлено через 46 минут
Кстати получилось следующее:
В ведомом приложении (которое будет вставлять) узнаем его winId
C++ (Qt)
1
2
3
    
WId id = this->winId();
ui->lblId->setText("WId= "+QString::number(id));
Запускаем его и копируем winId.

В ведущем приложении
C++ (Qt)
1
2
3
4
WId id = 1049354; // из ведомого приложения
QWindow *window = QWindow::fromWinId(id);
QWidget *widget = QWidget::createWindowContainer(window);
widget->setParent(this);
Ведомое вставилось в ведущее. Естественно нужно делать Qprocess из ведущего.
0
08.08.2017, 11:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2017, 11:52

Получить фокус ввода с клавитуры при наведении указателя на основное окно программы
Здравствуйте, у меня приложение, одно окно - QGraphicsView, со свойствами:...

Встраивание программы в окно приложения
Подскажите, пожалуйста! Можно ли внешнее приложение, зная его WId, встроить...

Встраивание UserControl в окно
На скрине знак предупреждения, можно как-то посмотреть о чём меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru