【问题标题】:X11 window does not put into QWidget for embedding in a Qt applicationX11 窗口未放入 QWidget 以嵌入 Qt 应用程序
【发布时间】:2013-05-23 15:06:21
【问题描述】:

有一个 Qt 应用程序。通过调用 XCreateWindow 函数在此应用程序中创建的 GL 窗口,我无法对其进行编辑。 我需要将 Xwindow 放在 Qt 应用程序中的 QWidget 中。

在文档中:

void QWidget::create ( WId window = 0, bool initializeWindow = true, 
    bool destroyOldWindow = true ) [protected]

如果窗口为 0,则创建一个新的窗口小部件窗口,否则将窗口小部件的窗口设置为窗口。初始化窗口设置几何图形等)如果 initializeWindow 为真。如果 initializeWindow 为 false,则不执行初始化。此参数仅在 window 是有效窗口时才有意义。

...

为了验证函数 QWidget::create 的结果,代码如下:

class ParentWindow : public QWidget
{
  Q_OBJECT

  public:
  ParentWindow(WId id)
  {
     create(id);
  }
};

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QPushButton* button = new QPushButton("MEGA BUTTON");
  button->show();
  ParentWindow w(button->winId());
  w.show();

  return a.exec();
}

当应用程序启动时,会出现一个空白窗口。虽然预期的窗​​口包含一个按钮(或成为一个按钮)。 如何将 X11 窗口放入我的 QWidget?

【问题讨论】:

    标签: c++ qt x11


    【解决方案1】:

    问题已解决:

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        Display* display = XOpenDisplay(NULL);
    
        XSynchronize(display, True);
        XSetErrorHandler(myErrorHandler);
    
        Window x11root = XDefaultRootWindow(display);
    
        int x = 500;
        int y = 500;
        unsigned int width = 150;
        unsigned int height = 150;
        unsigned int borderWidth = 0;
        long colorBlue = 0xff0000ff;
    
        Window x11w = XCreateSimpleWindow(display, x11root, x, y, 
            width, height, borderWidth, 1 /*magic number*/, colorBlue);
    
        QWidget w;
        w.resize(300, 300);
        w.show();
    
        XReparentWindow(display, x11w, w.winId(), 0, 0);
        XMapWindow(display, x11w); // must be performed after XReparentWindow, 
                                   // otherwise the window is not visible.
    
        return a.exec();
    }
    

    通过小部件解决问题 ParentWindow 失败 - xwindow 嵌入在 QWidget 中,但在调整窗口大小和关闭它时遇到问题(它不会关闭)。

    【讨论】:

      【解决方案2】:

      QX11EmbedContainer 可能是您需要的。

      【讨论】:

        【解决方案3】:

        让 Qt 创建您的 Window,然后将 Qt X11 Drawable 与您的 X11/GL 代码一起使用。

        对于 OpenGL 和 Qt,如果 Qt 使用 OpenGL 进行渲染,则必须使用 Qt OpenGL 上下文。请注意,Qt 期望 OpenGL 状态恢复到上次使用时的状态。

        您可以使用 QX11Info 访问 Drawable(另请查看 Compiler does not see QX11Info,因为这涵盖了在 Qt 中包含 X11 时的常见问题)。

        Qt 提供对 X11 和 OpenGL 的访问的方式似乎在主要版本和次要版本之间有所不同,因此您可能需要进行一些挖掘。

        我知道以上内容适用于 Qt5.1 到 5.5。 Qt5.6 有这种方法的问题,我还没有解决。

        【讨论】:

          【解决方案4】:

          您不应该在您的第一个 Qt 程序中接触窗口 ID。窗口 ID 是一个低级概念,Qt 程序员通常只需要它们来做 Qt 框架之外的事情。将小部件作为其他小部件的子级进行管理不是那种任务。

          我建议您从tutorials 之一开始。请特别查看here 以了解如何使一个小部件成为另一个小部件的子级。

          【讨论】:

          • 谢谢,但问题是我需要在 QWidget 中嵌入 x-window。这正是我的问题。
          • 您的解释令人困惑。您似乎想创建一个 Qt 小部件并在其中放置一个 Qt 按钮,然后您想做其他事情。目前尚不清楚究竟是什么。是否要重新设置现有顶级 X11 窗口并使其成为新 Qt 窗口小部件窗口的子级?
          • 是的,我想做。请原谅我模糊的解释。我的英语不够好=)
          猜你喜欢
          • 2012-04-22
          • 1970-01-01
          • 2016-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-17
          相关资源
          最近更新 更多