使用 UI 个设计文件并使用带有自定义构造函数 QT 的自定义小部件

Using UI design files and having a custom widget with custom constructor QT

我有 2 个继承自 QGLWidget 的自定义小部件,我的目标是使用这些小部件从 2 个不同的视图显示相同的场景。为此,我将第一个小部件与第二个小部件共享。然而,这需要一个自定义构造函数,而不是编译的 UI 文件提供的。 如

   // The line I mention from Compiled UI file
    widget_2 = new SideGlWidget(widget);
    // What I actually want this line to be
    widget_2 = new SideGlWidget(widget, MainScreen);

有人建议稍后使用 init 函数设置此类附加参数。那么如何设置QGLWidget的shareWidget成员呢? 这是 SideGlWidget

的构造函数
SideGlWidget::SideGlWidget(QWidget *parent,QGLWidget * shareWidget)
    : QGLWidget(parent,shareWidget)
{

}

欢迎任何评论和编辑。

处理通过 UI 文件生成的 Qt 小部件时,您无法更改调用自定义小部件的构造函数的方式。

那么你有两个选择:

  • SideGlWidget设置默认的第二个参数
  • 向您的小部件添加一个 init( sharedWidget) 方法并在 setupUi() 之后调用它(很可能在您的主 window 的构造函数中)。因此,您可以在显示之前将参数传递给侧边小部件。

This forum post解释的很详细

从更高的层次来看你的问题,我建议使用某种共享对象来保存两个小部件的公共数据,并使用继承或组合而不是定义一个小部件来使用另一个小部件。

这是http://doc.qt.io/qt-5/qopenglwidget.html对这个问题的官方最新解决方案:

When multiple QOpenGLWidgets are added as children to the same top-level widget, their contexts will share with each other. This does not apply for QOpenGLWidget instances that belong to different windows.

因此,通过从 QOpenglWidget 而不是 QGlWidget 继承,您根本不必处理上下文共享。请注意,updategl 函数已替换为 update 函数。