2012-04-10 77 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