1

有一个 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?

4

4 回答 4

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 中,但在调整窗口大小和关闭它时遇到问题(它不会关闭)。

于 2013-05-28T08:49:37.943 回答
0

QX11EmbedContainer可能是您所需要的。

于 2014-10-04T20:34:29.583 回答
0

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

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

您可以使用 QX11Info 访问 Drawable(同时检查编译器没有看到 QX11Info,因为这涵盖了将 X11 与 Qt 一起包含时的常见问题)。

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

我知道以上内容适用于 Qt5.1 到 5.5。Qt5.6 存在我尚未解决的这种方法的问题。

于 2016-06-07T11:12:14.020 回答
-1

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

我建议您从其中一个教程开始。在这里特别看一下如何使一个小部件成为另一个小部件的子级。

于 2013-05-24T19:42:47.187 回答