QT как встроить приложение в виджет QT

в нашем проекте у нас есть три независимых приложения, и мы должны разработать приложение управления QT, которое управляет этими тремя приложениями. Главное окно будет разделено на три подокна - в каждом из них будет отображаться другое приложение.
Я думал использовать QX11EmbedWidget и QX11EmbedContainer виджеты, но две проблемы с этим:

  1. QX11Embed * основан на протоколе X11, и я не знаю, поддерживается ли он на non-x11 системы, такие как ОС Windows.
  2. поскольку QT 5 эти классы не существуют, и в документации QT не упоминается почему.

Так что я не знаю, использовать его или нет - я буду рад получить ответы.
Кроме того, я вижу, что QT 5.1 содержит QWidget:: createWindowContainer (); функция, которая в некоторых сообщениях выглядит так, как это должно быть заменой X11Embed. Может ли кто-нибудь объяснить мне больше, как я могу использовать эту функцию для создать виджет QT, который будет запускать другое приложение (например, калькулятор) внутри него?

Я много искал в Google и не нашел ответов на мои вопросы.
Кто-нибудь может мне помочь? Я на правильном пути?
Спасибо!

2 ответов


Если все три независимых приложения написаны с Qt, и у вас есть их источник, вы должны быть в состоянии объединить их только через воспитание объектов GUI в Qt.

http://qt-project.org/doc/qt-4.8/objecttrees.html

http://qt-project.org/doc/qt-4.8/widgets-and-layouts.html

http://qt-project.org/doc/qt-4.8/mainwindows-mdi.html

Если у вас нет доступа к ним в таким образом, то, о чем вы говорите, похоже на управление окнами 3rd party. Это похоже на написание оболочки, например Проводника Windows, который управляет состоянием и размером других оконных приложений.

используйте программу, как Spy++ или AutoIt Spy для Windows, и аналогичные для других ОС, и узнать идентифицирующие маркировки ваших окон, которые вы хотите контролировать,как класс, название окна, и т.д. Или вы можете запустить exe самостоятельно в QProcess::startDetached() вид вещь.

http://qt-project.org/doc/qt-5.1/qtcore/qprocess.html#startDetached

затем с помощью зависимых от ОС вызовов управления windows. В библиотеке Qt нет этого материала, встроенного для сторонних окон, только для тех, которые находятся под QApplication, который вы запустили. Есть много примеров того, как делать такие вещи с помощью AutoHotKey или AHK. Это язык сценариев, который предназначен для автоматизации многих вещей в среде windows, и там порт для Mac также (хотя я сам не пробовал порт mac).

таким образом, в конце концов вы смотрите на поиск своего окна, вероятно, с таким вызовом:

#include <windows.h>

HWND hwnd_1 = ::FindWindow("Window_Class", "Window Name");
LONG retVal = GetWindowLongA(hwnd_1, GWL_STYLE); // to query the state of the window

затем манипулируйте положением и состоянием окна следующим образом:

::MoveWindow(hwnd_1, x, y, width, height, TRUE);
::ShowWindow(hwnd_1, SW_SHOWMAXIMIZED);

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

прозрачный QLabel с a pixmap

не удается заставить QSystemTrayIcon работать правильно с причиной активации

некоторые gotchas, которые появляются в Windows при выполнении всего этого, выясняют причуды пользовательского интерфейса Windows, когда они устанавливают масштабирование дисплея, отличное от того, что вы ожидаете, и если вы хотите хорошо играть с панелью задач и обрабатывать все модальные окна ваших программ, которыми вы манипулируете.

таким образом, в целом, это do-able. Qt сделает хороший интерфейс для выполнения этих команд, но в конце концов вы смотрите на много работы и отладки, чтобы получить его в красивом, надежном оконном менеджере.

надеюсь, что это поможет.


Я никогда не пробовал это сам, но из документов в Qt 5.1 я бы попробовал QWindow:: fromId(WID id), который дает вам QWindow, который должен быть встроен с createWindowContainer:

QWindow * QWindow::fromWinId (WID id) [static] создает локальный представительство окна, созданного другим процессом или с помощью собственные библиотеки ниже Qt.

учитывая идентификатор дескриптора для собственного окна, Этот метод создает QWindow объект, который можно использовать для представление окна при вызове методов как setParent () и setTransientParent (). Это можно использовать, на платформы которые поддерживают его, врезать окно внутри контейнера или к сделайте оконную ручку поверх окна, созданного другим процессом.

но никакой гарантии. :-)