2013-08-27 22 views
7

W naszym projekcie mamy trzy niezależne aplikacje i musimy opracować aplikację kontrolującą QT, która kontroluje te trzy aplikacje. Główne okno zostanie podzielone na trzy podokna - każda z nich wyświetla kolejną jedną aplikację.
myślałem użyć QX11EmbedWidget i QX11EmbedContainer widżety, ale dwa problemy z tym:QT Jak osadzić aplikację w widgecie QT

  1. QX11Embed * bazuje na protokole X11 i nie wiem, czy to jest obsługiwana w systemach innych niż x11 takich jak Windows.
  2. Od QT 5 klasy te nie istnieją, a dokumentacja QT nie podaje przyczyny.

Tak więc nie wiem, czy go użyć, czy nie - będę szczęśliwy, aby uzyskać odpowiedzi.
Ponadto widzę, że QT 5.1 zawiera funkcję QWidget::createWindowContainer();, która w niektórych postach wygląda tak, jakby była zamiennikiem X11Embed. Czy ktoś może mi jeszcze bardziej wyjaśnić, w jaki sposób mogę użyć tej funkcji do utworzenia widgetu QT, który uruchomi inną aplikację (np. Kalkulator) wewnątrz?

Szukałem dużo w Google i nie znalazłem odpowiedzi na moje pytania.
Czy ktoś może mi pomóc? Czy jestem na dobrej drodze?
Dzięki!

Odpowiedz

8

Jeśli wszystkie trzy niezależne aplikacje są napisane z Qt, a ty masz ich źródło, powinieneś być w stanie je zunifikować tylko poprzez rodzicielstwo obiektów GUI w 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

Jeśli nie masz dostępu do nich w ten sposób, to co mówisz jest jak partia 3rd zarządzania oknami. Jest to trochę jak pisanie powłoki, takiej jak Eksplorator Windows, która manipuluje stanem i rozmiarem innych aplikacji okienkowych.

Użyj programu typu Spy ++ lub AutoIt Spy dla systemu Windows i podobnych programów dla innych systemów operacyjnych, a także poznaj oznaczenia identyfikacyjne okien, które chcesz kontrolować, takie jak klasa, tytuł okna itp.Lub możesz uruchomić exe siebie w rodzaju rzeczy.

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

Następnie za pomocą systemu operacyjnego połączenia zależne kontrolowania okna. Biblioteka Qt nie ma tych rzeczy wbudowanych w okna innych firm, tylko dla tych pod uruchomioną QApplication. Istnieje wiele przykładów robienia takich rzeczy przez AutoHotKey lub AHK. Jest to język skryptowy, który jest przeznaczony do zautomatyzowania wielu rzeczy w środowisku Windows, i jest też port dla Maców (chociaż sam nie testowałem portu Mac).

Więc w końcu szukasz na znalezienie okno prawdopodobnie z rozmowy jak ta:

#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 

następnie zmieniać położenie i stan okna tak:

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

Można nawet narysuj widżety na kontrolowanych oknach, jeśli ustawisz flagi okienne poprawnie dla okien, którymi manipulujesz.

transparent QLabel with a pixmap

Cannot get QSystemTrayIcon to work correctly with activation reason

niektórych pułapek, które pojawią się w systemie Windows, gdy robi to wszystko, jest ustaleniu dziwactwa okien UI kiedy ustawić wyświetlanie skalowania różni się od tego, co można się spodziewać, a jeśli chcesz grać ładnie za pomocą paska zadań i obsługiwać wszystkie okna modalne manipulowanych programów.

Ogólnie rzecz biorąc, jest to możliwe. Qt stworzy przyjemny interfejs do wykonywania tych poleceń, ale na koniec patrzysz na dużo pracy i debugowania, aby uzyskać go w pięknym, niezawodnym menedżerze okien.

Nadzieję, że pomaga.

+1

Przede wszystkim dziękuję mi odpowiedzieć, zacząłem myśleć, że nikt nie może mi odpowiedzieć. Nie mam dostępu do kodu źródłowego. 2 Qs: co wiesz o QWidget :: createWindowContainer(); funkcja, czy może wykonać całą pracę? 2. jeśli twoje rozwiązanie jest wymagane dużo portowania do okien - może to nie jest warte - a skróconym rozwiązaniem jest napisanie aplikacji w .NET dla Windows i nie wiem dla Linux-Ubuntu? – RRR

+0

Nie użyłem wcześniej 'createWindowContainer'. Wygląda na to, że jest to skrót do uaktualniania dowolnego 'QWindow', takiego jak scenegraph lub Qt Quick lub okno OpenGL, aby mieć pełną dekorację okna, która działa z innymi QWidgetami. Wygląda na to, że nie może po prostu wziąć żadnego identyfikatora HWND ... http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/ – phyatt

+0

Obsługa okien nie jest zbyt trudna. To wymaga badań i pracy, ale wznoszenie i manipulowanie nimi w systemie Windows nie powinno zająć więcej niż kilka godzin. Nie zrobiłem tego jeszcze w Linuksie i OSX-ie, ale powinno być po prostu kwestia uzyskania właściwych połączeń. – phyatt

6

nigdy nie próbowałem to sam, ale z docs w Qt 5.1 Chciałbym spróbować QWindow :: fromId (wid id), co daje QWindow, który powinien być zabudowany z createWindowContainer:

QWindow * QWindow :: fromWinId (identyfikator WI) [statyczny] Tworzy lokalną reprezentację okna utworzonego przez inny proces lub przy użyciu bibliotek natywnych pod Qt.

Biorąc identyfikator uchwyt natywnego okna, sposób ten stwarza QWindow przedmiot, który może być wykorzystany do reprezentacji okno podczas wywoływania metody jak setParent() i setTransientParent(). Można go używać na obsługiwanych platformach , do osadzania okna wewnątrz kontenera lub do , aby okno było przyklejone do okna utworzonego przez inny proces.

Ale bez gwarancji. :-)

+0

Jak dokładnie możemy uzyskać identyfikator klamki do zewnętrznej aplikacji (utworzonej przez QProcess)? – user3079474

+0

Buggy! https://bugreports.qt.io/browse/QTBUG-40320 :) – mlvljr