X11窗口没有放入QWidget嵌入Qt应用程序

时间:2013-05-23 15:06:22

标签: c++ qt x11

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

在文档中:

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

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

...

为了验证函数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?

4 个答案:

答案 0 :(得分:0)

问题已解决:

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中,但是在调整窗口大小并关闭它时会出现问题(它没有关闭)。

答案 1 :(得分:0)

QX11EmbedContainer可能就是您所需要的。

答案 2 :(得分:0)

让Qt创建你的窗口然后使用Qt X11 Drawable和你的X11 / GL代码。

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

您可以使用QX11Info访问Drawable(同时检查Compiler does not see QX11Info,因为这包含了将X11与Qt包含在一起时的常见问题)。

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

我知道上面的Qt5.1可以达到5.5。 Qt5.6这个方法有问题,我还没有解决。

答案 3 :(得分:-1)

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

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