2013-08-27 17 views
7

Dans notre projet, nous avons trois applications indépendantes, et nous devons développer une application de contrôle QT qui contrôle ces trois applications. La fenêtre principale sera séparée en trois sous-fenêtres - chacune affichant une autre application.
Je pensais utiliser QX11EmbedWidget et QX11EmbedContainer widgets, mais deux problèmes que:QT Comment intégrer une application dans un widget QT

  1. Le QX11Embed * est basé sur le protocole X11 et je ne sais pas si elle est prise en charge sur les systèmes non-x11 comme système d'exploitation Windows.
  2. Depuis QT 5 ces classes n'existent pas, et la documentation QT ne mentionne pas pourquoi.

Alors que je ne sais pas s'il faut l'utiliser ou non - je serai heureux d'avoir une réponse.
En outre, je vois que le QT 5.1 contient QWidget::createWindowContainer(); fonction que dans certains messages, il semble que ce devrait être le remplacement de l'X11Embed. Quelqu'un peut-il m'expliquer plus comment puis-je utiliser cette fonction pour créer un widget QT qui va exécuter une autre application (une calculatrice par exemple) à l'intérieur de son?

J'ai beaucoup cherché dans Google et je n'ai pas trouvé de réponses à mes questions.
Quelqu'un peut-il m'aider s'il vous plaît? Suis-je sur la bonne voie?
Merci!

Répondre

8

Si les trois applications indépendantes sont écrites avec Qt, et que vous avez leur source, vous devriez être capable de les unifier à travers le parentage des objets GUI dans 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

Si vous n'avez pas accès à eux de cette façon, ce que vous parlez est comme la gestion des fenêtres 3ème partie. C'est un peu comme écrire un shell, comme Windows Explorer, qui manipule l'état et la taille des autres applications de fenêtre. Utilisez un programme comme Spy ++ ou AutoIt Spy pour Windows et similaire pour les autres systèmes d'exploitation, et apprenez les marques d'identification de vos fenêtres que vous voulez contrôler, comme la classe, le titre de la fenêtre, etc.Ou vous pouvez lancer l'exe vous-même dans un QProcess::startDetached() sorte de chose.

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

Ensuite, en utilisant les appels dépendants OS contrôlent les fenêtres. La bibliothèque Qt n'a pas ce truc intégré pour les fenêtres tierces, seulement pour celles sous QApplication que vous avez lancé. Il y a beaucoup d'exemples de faire des choses comme ça par AutoHotKey, ou AHK. C'est un langage de script qui est fait pour automatiser beaucoup de choses dans l'environnement Windows, et il y a également un port pour Mac (même si je n'ai pas essayé le port mac moi-même).

Donc à la fin que vous cherchez à trouver votre fenêtre probablement avec un appel comme celui-ci:

#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 

manipuler ensuite la position et l'état de la fenêtre comme ceci:

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

Vous pouvez même dessiner des widgets au-dessus des fenêtres que vous contrôlez si vous définissez vos indicateurs de fenêtre correctement pour les fenêtres que vous manipulez.

transparent QLabel with a pixmap

Cannot get QSystemTrayIcon to work correctly with activation reason

Quelques pièges qui se présentent sous Windows lorsque vous faites tout cela, est de trouver les bizarreries de l'interface utilisateur de Windows quand ils sélectionnez l'affichage d'échelle différent de ce que vous attendez, et si vous voulez jouer bien avec la barre des tâches, et gérer toutes les fenêtres modales de vos programmes que vous manipulez.

Donc globalement, c'est faisable. Qt fera une belle interface pour l'exécution de ces commandes, mais à la fin vous aurez besoin de beaucoup de travail et de débogage pour l'obtenir dans un gestionnaire de fenêtres beau et fiable.

Espérons que ça aide.

+1

Tout d'abord merci de me répondre, j'ai commencé à penser que personne ne pouvait me répondre. Je n'ai pas accès au code source. 2 Qs: que savez-vous de QWidget :: createWindowContainer(); fonction, peut-il faire tout le travail? 2. Si votre solution nécessite beaucoup de portage sur Windows - peut-être que cela ne vaut pas la peine - et la solution en court-circuit est d'écrire l'application dans .NET pour Windows et dans Je ne sais pas pour Linux-Ubuntu? – RRR

+0

Je n'ai pas utilisé 'createWindowContainer' avant. Il semble que ce soit un raccourci pour mettre à jour n'importe quel type de 'QWindow', comme le SceneGraph ou le Qt Quick ou une fenêtre OpenGL pour avoir une décoration de fenêtre complète qui fonctionne avec d'autres QWidgets. Il ne semble pas que cela puisse prendre n'importe quel ID HWND ... http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/ – phyatt

+0

La manipulation des fenêtres n'est pas trop difficile. Cela demande de la recherche et du travail, mais être en train de les manipuler sous Windows ne devrait pas prendre plus de quelques heures. Je ne l'ai pas encore fait sous Linux et OSX, mais il faudrait juste que les bons appels soient mis en place. – phyatt

6

Je ne ai jamais essayé moi-même, mais à partir de la documentation dans Qt 5.1 Je voudrais essayer QWindow :: fromId (id IFD), ce qui vous donne un QWindow, qui devrait être intégrables avec createWindowContainer:

QWindow * QWindow :: fromWinId (WID id) [statique] Crée une représentation locale d'une fenêtre créée par un autre processus ou en utilisant les bibliothèques natives en dessous de Qt.

Compte tenu de l'identifiant de la poignée d'une fenêtre native, cette méthode crée un objet QWindow qui peut être utilisé pour représenter la fenêtre lors de l'invocation des méthodes comme setParent() et setTransientParent(). Ceci peut être utilisé, sur les plates-formes qui le supportent, pour incorporer une fenêtre à l'intérieur d'un conteneur ou pour faire coller une fenêtre au-dessus d'une fenêtre créée par un autre processus.

Mais aucune garantie. :-)

+0

Comment exactement pouvons-nous obtenir l'identificateur de poignée à une application externe (Créé par QProcess)? – user3079474

+0

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