【问题标题】:Using UI design files and having a custom widget with custom constructor QT使用 UI 设计文件并拥有带有自定义构造函数 QT 的自定义小部件
【发布时间】:2015-08-25 12:37:27
【问题描述】:

我有 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)
{

}

欢迎任何 cmets 和编辑。

【问题讨论】:

  • 这是什么语言?看起来像 C++?
  • 没错,第一行来自ui_mainwindow.h,这要归功于UI文件的编译,第二行是我需要的
  • 显示SideGlWidget 的构造函数的代码会有帮助。我假设SideGlWidgetQGLWidget 的子类,那么您需要添加第二个构造函数,将shareWidget 转发到基类构造函数。
  • 我用该信息编辑了问题

标签: c++ qt user-interface qglwidget


【解决方案1】:

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

那么你有两个选择:

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

This forum post详细解释。

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

【讨论】:

  • init(sharedWidget) 方法的唯一问题是,除了在构造函数中之外,我找不到设置“sharedWidget”的方法。也许这是一个没有二传手的私人领域?关于您的一般建议,您如何分享上下文?您是否建议将上下文存储为静态类的成员,使其可以全局访问。
  • * Shared Widget 必须在类的数据成员中的某个位置,因此如果没有 setter,您可以自己添加一个。 * 至于我的建议,我是说如果你的两个小部件只使用不同的参数(相机位置)做同样的事情(即显示 Open GL 场景),那么它们是同一类的实例似乎是合乎逻辑的,或者至少共享一个基类。
【解决方案2】:

这是来自http://doc.qt.io/qt-5/qopenglwidget.html的官方最新解决方案:

当多个 QOpenGLWidgets 作为子级添加到同一个 顶级小部件,它们的上下文将相互共享。这确实 不适用于属于不同的QOpenGLWidget实例 窗户。

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

【讨论】:

    猜你喜欢
    • 2023-01-22
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多