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

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

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

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

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

8

Решение

Если все три независимых приложения написаны на 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

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

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

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

Затем с помощью зависимых от ОС вызовов управляйте окнами. В библиотеке 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 с растровым изображением

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

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

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

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

9

Другие решения

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

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

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

Но нет гарантии. 🙂

7

По вопросам рекламы [email protected]