2012-04-10 2 views
8

Я хочу встроить два QWidgets в окно, созданное с помощью XLib. Я написал этот код:Внедрение QWidget в окно X11

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

Я могу запустить эту программу успешно, но эти виджеты не получают встроенные в окно X11 я создал. Все три вещи создаются, но независимо. Эти виджеты не внедряются в окно.

+0

Chek это: QX11EmbedWidget – HeyYO

+0

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

+0

я использовал QX11 контейнер, чтобы сделать то же самое. Но мне нужно сделать это, используя окно, созданное специально с использованием XLib, и, следовательно, вопрос. –

ответ

5

следующее указывает, что, возможно, вам нужно подумать о порядке отображения виджетов, чтобы winId для ваших виджетов был настроен на то, что можно передать в XReparentWindow.

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

+0

Я думаю, что вы просите меня сделать то, что я уже делаю? В любом случае я пробовал обратный путь, вызвав show() для 2 виджетов после повторного воспитания, но не имел никакого эффекта. –

+0

Ну, перестраивая повторное воссоединение перед промывкой и отображением окна X11, фактически работало :-) Большое спасибо. И идет щедрость. –

+0

@AmitTomar: Не могли бы вы предоставить полный рабочий пример? Это не работает для меня. – theV0ID

2

В альтернативном решении, вы можете использовать вместо QX11EmbedWidget QWidget в кварт применения и протокола XEmbed в применении Xlib, таких как делать это QX11EmbedContainer. Это решение имеет плюс: вы можете реализовать различное окно в разных процессах.

+0

Хотя, это работает только для Qt4, а не для Qt5, правильно? Пожалуйста, объясните иначе. – theV0ID

+0

@ theV0ID см. Http://doc.qt.io/qt-5/qwidget.html#createWindowContainer для Qt5 – Milovidov

Смежные вопросы