【问题标题】:Embedding QWidget into X11 Window将 QWidget 嵌入 X11 窗口
【发布时间】:2012-04-22 18:39:15
【问题描述】:

我想将两个 QWidget 嵌入到使用 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 窗口中。这三样东西都是被创造出来的,但都是独立的。这些小部件没有嵌入到窗口中。

【问题讨论】:

  • 看看这个:QX11EmbedWidget
  • 我曾经使用 QX11 容器来做同样的事情。但我需要使用专门使用 XLib 创建的窗口来执行此操作,因此存在问题。
  • @AmitTomar QX11 容器的头文件是什么?还是我必须为它下载一个插件?
  • @PrakharMohanSrivastava Qt 4.7 和 Qt 4.8 支持此类。据我所知,在 Qt 5.0 中它不存在。

标签: c++ qt x11 xlib


【解决方案1】:

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

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

【讨论】:

  • 我想你要我做的是我已经在做的事情?无论如何,我尝试了另一种方式,在重新设置完成后为 2 个小部件调用 show(),但没有效果。
  • 好吧,在刷新和显示 X11 窗口之前重新安排重新设置确实有效 :-) 非常感谢。赏金就来了。
  • @AmitTomar:您能否提供一个完整的示例?它对我不起作用。
【解决方案2】:

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

【讨论】:

  • 不过,这仅适用于 Qt4,不适用于 Qt5,对吧?请另作解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多