2012-04-10 7 views
8

Chcę osadzić dwa QWidgets w oknie utworzonym przy użyciu XLib. Napisałem ten kod:Umieszczanie QWidget w X11 Okno

// 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(); 
} 

Jestem w stanie uruchomić ten program, ale te widgety nie są osadzane w oknie X11, które utworzyłem. Wszystkie trzy rzeczy powstają, ale niezależnie. Widżety te nie są osadzane w oknie.

+0

Sprawdź to: QX11EmbedWidget – HeyYO

+0

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

+0

Użyłem pojemnika QX11, aby zrobić to samo. Ale muszę to zrobić za pomocą okna utworzonego specjalnie przy użyciu XLib, a więc pytanie. –

Odpowiedz

5

Poniższe może świadczyć o tym, że należy zastanowić się nad kolejnością wyświetlania widżetów, aby zestaw winId dla widgetów był ustawiony na coś, co można przekazać do XReparentWindow.

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

+0

Myślę, że to, o co mnie proszę, to to, co już robię? W każdym razie próbowałem na odwrót, wywołując show() dla 2 widżetów po zakończeniu ponownego rodzicielstwa, ale bez skutku. –

+0

Cóż, przeorganizowanie ponownego rodzicielstwa przed opróżnieniem i wyświetleniem okna X11 faktycznie zadziałało :-) Wielkie dzięki. I tam idzie bounty. –

+0

@AmitTomar: Czy mógłbyś podać w pełni działający przykład? To nie działa dla mnie. – theV0ID

2

Jako alternatywne rozwiązanie, można użyć QX11EmbedWidget zamiast QWidget w Qt aplikacji i protokołu XEmbed w zastosowaniu xlib, takich jak robią to QX11EmbedContainer. To rozwiązanie ma plus: możesz zrealizować różne okna w różnych procesach.

+0

Jednak działa to tylko dla Qt4, a nie dla Qt5, prawda? Proszę wyjaśnij inaczej. – theV0ID

+0

@ theV0ID patrz http://doc.qt.io/qt-5/qwidget.html#createWindowContainer dla Qt5 – Milovidov