2012-04-10 81 views
8

我想將兩個QWidget嵌入到使用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

赤了這一點:QX11EmbedWidget – HeyYO 2012-04-12 14:08:43

+0

[QX11EmbedWidget](http://qt-project.org/doc/qt-4.8/qx11embedwidget.html) – 2012-04-12 15:42:40

+0

我曾用過的QX11容器做同樣的。但是我需要使用專門使用XLib創建的窗口進行操作,因此也是一個問題。 – 2012-04-13 05:15:24

回答

5

以下內容可能表明您可能需要考慮顯示窗口小部件的順序,以便將窗口小部件的winId設置爲可傳遞給XReparentWindow的窗口。

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

+0

我想你要求我做的是我已經在做什麼?無論如何,我通過調用show()方法來完成重做父母之後的2個小部件,但沒有任何效果。 – 2012-04-16 05:00:35

+0

那麼,在刷新之前重新排列重新註冊父母並顯示X11窗口實際工作:-)非常感謝。那就是賞金。 – 2012-04-16 12:37:27

+0

@AmitTomar:你能否提供一個完整的示例?它不適合我。 – theV0ID 2016-08-05 21:58:08

2

作爲替代的解決方案,可以在Qt應用程序和協議XEMBED在XLIB應用程序,如這樣做QX11EmbedContainer使用QX11EmbedWidget代替QWidget的。 該解決方案有一個優點:您可以在不同的進程中實現不同的窗口。

+0

雖然,這隻適用於Qt4,不適用於Qt5,對吧?請另外說明。 – theV0ID 2016-08-05 21:59:03

+0

@ theV0ID請參閱http://doc.qt.io/qt-5/qwidget.html#createWindowContainer for Qt5 – Milovidov 2016-08-06 19:02:31