2012-04-10 11 views
8

Ich möchte zwei QWidgets in ein Fenster einbetten, das mit XLib erstellt wurde. Ich habe diesen Code geschrieben:Einbetten von QWidget in X11-Fenster

// Assume all the necessary headers included 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    // Create widget 1 
    QWidget widget1 ; 
    widget1.setGeometry(44,44,666,666); 
    widget1.show(); 

    // Create widget 2 
    QWidget widget2 ; 
    widget2.setGeometry(144,144,666,666); 
    widget2.show();  

    Display *display = XOpenDisplay(0); // 0 parameter for default values 

    if (display != NULL) 
    { 
     // Create the x11 window using XLib 
     Window w = XCreateWindow(display, DefaultRootWindow(display), 
     0, 0, 1200, 1100, 0,CopyFromParent, CopyFromParent, CopyFromParent, 0, 0); 

     XMapWindow(display, w); 
     XFlush(display); 

     XReparentWindow(display, widget1.winId(), w, 0, 0); 
     XReparentWindow(display, widget2.winId(), w, 1, 10); 
    } 

    else 
     std::cout << "Error: Opening display" << std::endl ; 

     return app.exec(); 
} 

Ich bin in der Lage, dieses Programm erfolgreich zu laufen, aber diese Widgets werden nicht in die X11-Fenster eingebettet immer ich herstellte. Alle drei Dinge werden kreiert, aber unabhängig voneinander. Diese Widgets werden nicht in das Fenster eingebettet.

+0

Chek diese aus: QX11EmbedWidget – HeyYO

+0

[QX11EmbedWidget] (http://qt-project.org/doc/qt-4.8/qx11embedwidget.html) –

+0

Ich hatte QX11-Container verwendet, um das gleiche zu tun. Aber ich muss es tun, indem ich das Fenster verwende, das speziell mit XLib erstellt wurde, und daher die Frage. –

Antwort

5

Das Folgende würde bedeuten, dass Sie vielleicht über die Reihenfolge der Anzeige der Widgets nachdenken müssen, damit die winId für Ihre Widgets auf etwas gesetzt wird, das an XReparentWindow übergeben werden kann.

http://www.qtforum.org/article/16529/xreparent-external-x11-application.html

+0

Ich denke, was Sie mich fragen, ist, was ich bereits mache? Jedenfalls habe ich es anders herum versucht, indem ich show() für die 2 Widgets aufgerufen habe, nachdem das erneute Parenting durchgeführt wurde, aber ohne Wirkung. –

+0

Nun, die Neuparenzierung vor dem Spülen und Anzeigen des X11-Fensters neu zu arrangieren, funktionierte tatsächlich :-) Vielen Dank. Und da geht die Belohnung. –

+0

@AmitTomar: Könnten Sie bitte ein voll funktionsfähiges Beispiel geben? Es funktioniert nicht für mich. – theV0ID

2

Als alternative Lösung können Sie QX11EmbedWidget statt QWidget in qt Anwendung und XEmbed Protokoll in XLib Anwendung, wie zum Beispiel tun, diese QX11EmbedContainer zu verwenden. Diese Lösung hat ein Plus: Sie können verschiedene Fenster in verschiedenen Prozessen realisieren.

+0

Obwohl das nur für Qt4 funktioniert, nicht für Qt5, oder? Bitte erklären Sie es anders. – theV0ID

+0

@ theV0ID siehe http://doc.qt.io/qt-5/qwidget.html#createWindowContainer für Qt5 – Milovidov