将QWidget嵌入X11窗口

时间:2012-04-10 13:01:57

标签: c++ qt x11 xlib

我想将两个QWidgets嵌入到使用XLib创建的窗口中。我写了这段代码:

// 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窗口中。这三件事都是创造出来的,但却是独立的。这些小部件没有嵌入到窗口中。

2 个答案:

答案 0 :(得分:5)

以下内容表明您可能需要考虑显示小部件的顺序,以便将小部件的winId设置为可以传递给XReparentWindow的内容。

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

答案 1 :(得分:2)

作为替代解决方案,您可以在qt应用程序中使用QX11EmbedWidget代替QWidget,在XLib应用程序中使用XEmbed协议,例如执行此操作QX11EmbedContainer。 这个解决方案有一个好处:你可以在不同的过程中实现不同的窗口。