2013-08-27 19 views
7

Nel nostro progetto abbiamo tre applicazioni indipendenti e dobbiamo sviluppare un'applicazione di controllo QT che controlli queste tre applicazioni. La finestra principale sarà separata da tre finestre secondarie: ognuna visualizza un'altra applicazione.
ho pensato di usare QX11EmbedWidget e QX11EmbedContainer widget, ma due problemi con questo:QT Come incorporare un'applicazione nel widget QT

  1. Il QX11Embed * è basato sul protocollo X11 e io non so se è supportato su sistemi non-x11, come il sistema operativo Windows.
  2. Dal QT 5 queste classi non sono esistenti e la documentazione QT non ne spiega il motivo.

In modo che non so se usarlo o no - Sarò felice di ottenere una risposta.
Inoltre, il QT 5.1 contiene la funzione QWidget::createWindowContainer(); che in alcuni post sembra che questa dovrebbe essere la sostituzione di X11Embed. Qualcuno può spiegarmi di più su come posso usare questa funzione per creare un widget QT che eseguirà un'altra applicazione (una Calcolatrice per esempio) al suo interno?

Ho cercato molto su Google e non ho trovato risposta alle mie Q.
Qualcuno può aiutarmi per favore? Sono sulla buona strada?
Grazie!

risposta

8

Se tutte e tre le applicazioni indipendenti sono state scritte con Qt e si ha la loro origine, si dovrebbe essere in grado di unificarle solo attraverso la genitorialità degli oggetti della GUI in 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

Se non si dispone di accesso ad essi in quel modo, che cosa si sta parlando è come terzo partito gestione delle finestre. È come scrivere una shell, come Windows Explorer, che manipola lo stato e le dimensioni di altre applicazioni della finestra.

Utilizzare un programma come Spy ++ o AutoIt Spy per Windows e simili per altri sistemi operativi e imparare i segni di identificazione delle finestre che si desidera controllare, come la classe, il titolo della finestra, ecc.Oppure puoi lanciare l'exe te stesso in una sorta di cosa QProcess::startDetached().

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

Quindi, utilizzando il sistema operativo chiamate dipendenti controllano le finestre. La libreria Qt non ha questa roba incorporata per le finestre di terze parti, solo per quelle sotto la QApplicazione che hai lanciato. Ci sono molti esempi di come fare AutoHotKey o AHK. È un linguaggio di scripting che è stato creato per automatizzare molte cose nell'ambiente Windows, e c'è anche una porta per Mac (anche se non ho provato personalmente la porta mac).

Così alla fine si sta cercando di trovare la finestra probabilmente con una chiamata del genere:

#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 

quindi modificare la posizione e lo stato della finestra in questo modo:

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

Puoi anche disegnare i widget in cima alle finestre che si stanno controllando se si impostano i flag delle finestre correttamente per le finestre che si stanno manipolando.

transparent QLabel with a pixmap

Cannot get QSystemTrayIcon to work correctly with activation reason

alcuni grattacapi che sorgono in Windows quando si fa tutto questo, è scoprire le peculiarità della interfaccia utente di Windows quando impostare la visualizzazione di scala diverso da quello che ci si aspetta, e se vuoi giocare bene con la barra delle applicazioni e gestire tutte le finestre modali dei programmi che stai manipolando.

Quindi, nel complesso, è fattibile. Qt creerà una bella interfaccia per l'esecuzione di questi comandi, ma alla fine stai cercando un sacco di lavoro e debug per ottenere un window manager bello, affidabile.

Spero che questo aiuti.

+1

Prima di tutto grazie, rispondimi, ho iniziato a pensare che nessuno potesse rispondermi. Non ho accesso al codice sorgente. 2 Q: cosa sai di QWidget :: createWindowContainer(); funzione, può fare tutto il lavoro? 2. se la tua soluzione richiede molto il porting su windows - forse non vale la pena - la soluzione in cortocircuito è scrivere l'app in .NET per Windows e in I do not for Linux-Ubuntu? – RRR

+0

Non ho usato 'createWindowContainer' prima. Sembra che si tratti di una scorciatoia per l'aggiornamento di qualsiasi tipo di 'QWindow', come la scenegraph o la finestra Qt Quick o OpenGL per avere una decorazione di finestre completa che funzioni con altri QWidgets. Non sembra che possa prendere qualsiasi ID HWND ... http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/ – phyatt

+0

La gestione delle finestre non è troppo difficile. Richiede ricerca e lavoro, ma essere in piedi e manipolarli in Windows non dovrebbe richiedere più di qualche ora. Non l'ho ancora fatto in Linux e OSX, ma dovrebbe essere solo questione di ottenere le chiamate giuste. – phyatt

6

ho mai provato io stesso, ma dalla documentazione in Qt 5.1 proverei QWindow :: identità_mittente (WID id), che vi dà un QWindow, che dovrebbe essere integrabile con createWindowContainer:

QWindow * QWindow :: fromWinId (WId id) [statico] Crea una rappresentazione locale di una finestra creata da un altro processo o utilizzando le librerie native sotto Qt.

Data la maniglia id di una finestra nativa, questo metodo crea un oggetto QWindow che può essere utilizzata per rappresentare la finestra quando richiamare i metodi come setParent() e setTransientParent(). Questo può essere usato, sulle piattaforme che lo supportano, per incorporare una finestra all'interno di un contenitore o su fare una finestra sulla parte superiore di una finestra creata da un altro processo.

Ma nessuna garanzia. :-)

+0

In che modo è possibile ottenere l'ID handle per un'applicazione esterna (creata tramite QProcess)? – user3079474

+0

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