8

XLibを使用して作成されたウィンドウに2つのQWidgetsを埋め込みたい。私はこのコードを書きました:

// 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ウィンドウにこれらのウィジェットが埋め込まれていません。3つすべてが作成されていますが、独立しています。これらのウィジェットはウィンドウに埋め込まれていません。

4

2 に答える 2

5

以下は、ウィジェットのwinIdがXReparentWindowに渡すことができるものに設定されるように、ウィジェットを表示する順序を考慮する必要があることを示しています。

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

于 2012-04-13T18:59:21.523 に答える
2

別の解決策として、このQX11EmbedContainerを実行するなど、qtアプリケーションではQWidgetの代わりにQX11EmbedWidget使用し、XLibアプリケーションではXEmbedプロトコルを使用できます。このソリューションにはプラスがあります。さまざまなプロセスでさまざまなウィンドウを実現できます。

于 2013-01-19T23:55:14.253 に答える