2

我正在使用 Qt Creator 设计用户界面。我有一个覆盖所有表单的openGLwidget,我想在小部件上放置一些与底部对齐的按钮和某种通知框架。有没有默认的方法来做到这一点?

当我尝试在创建者上进行设计时,我无法摆脱布局限制并且不允许我将小部件放置在 openglwidget 上。

4

1 回答 1

2

第一次阅读问题时,我将其阅读为“如何制作QOpenGLWidget带有按钮的平视显示器?”。

How to make a QOpenGLWidgetwith Head-Up Display (painted with QPainter),我曾经在SO: Paint a rect on qglwidget at specific times 中回答。然而,只有绘画——没有交互式小部件。

因此,我准备了一个新样本testQGLWidgetHUDButtons.cc

#include <QtWidgets>

class OpenGLWidget: public QOpenGLWidget, public QOpenGLFunctions {

  private:
    struct ClearColor {
      float r, g, b;
      ClearColor(): r(0.6f), g(0.8f), b(1.0f) { }
    } _clearColor;

  public:
    OpenGLWidget(QWidget *pQParent = nullptr):
      QOpenGLWidget(pQParent),
      QOpenGLFunctions()
    { }

    virtual ~OpenGLWidget() = default;

    OpenGLWidget(const OpenGLWidget&) = default;
    OpenGLWidget& operator=(const OpenGLWidget&) = default;

    void setClearColor(float r, float g, float b);

  protected:

    virtual void initializeGL() override;
    virtual void paintGL() override;

};

void OpenGLWidget::setClearColor(float r, float g, float b)
{
  _clearColor.r = r; _clearColor.g = g; _clearColor.b = b;
  update(); // force update of widget
}

void OpenGLWidget::initializeGL()
{
  initializeOpenGLFunctions();
}

void OpenGLWidget::paintGL()
{
  glClearColor(
    _clearColor.r, _clearColor.g, _clearColor.b, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  OpenGLWidget qWin;
  QGridLayout qGrid;
  QPushButton qBtn1(QString::fromUtf8("Black BG"));
  qGrid.addWidget(&qBtn1, 1, 1);
  QPushButton qBtn2(QString::fromUtf8("White BG"));
  qGrid.addWidget(&qBtn2, 1, 2);
  QPushButton qBtn3(QString::fromUtf8("Blue BG"));
  qGrid.addWidget(&qBtn3, 1, 3);
  qGrid.setRowStretch(0, 1);
  qGrid.setColumnStretch(0, 1);
  qWin.setLayout(&qGrid);
  qWin.show();
  // install signal handlers
  QObject::connect(&qBtn1, &QPushButton::clicked,
    [&qWin](bool) { qWin.setClearColor(0.0f, 0.0f, 0.0f); });
  QObject::connect(&qBtn2, &QPushButton::clicked,
    [&qWin](bool) { qWin.setClearColor(1.0f, 1.0f, 1.0f); });
  QObject::connect(&qBtn3, &QPushButton::clicked,
    [&qWin](bool) { qWin.setClearColor(0.6f, 0.8f, 1.0f); });
  // runtime loop
  return app.exec();
}

和项目文件testQGLWidgetHUDButtons.pro

SOURCES = testQGLWidgetHUDButtons.cc

QT += widgets opengl

在 Windows 10 上用 VS2013 编译测试:

Windows 10 中 testQGLWidgetHUDButtons 的快照

它实际上很容易——QOpenGLWidget源自QWidget. QWidget提供方法QWidget::setLayout()。要添加子小部件,QLayout应该使用 a 来管理父小部件中子小部件的布局(并在父小部件布局时参与大小协商)。

为了简单起见,我使用了一个QGridLayoutwhere 按钮被放置在单元格 (1, 1)、(1, 2) 和 (1, 3) 中。第 0 行和第 0 列留空,但可以进行拉伸。这可以有效地将按钮附加在右下角。


当我即将发布这个答案时,我再次查看了这个问题,并意识到标题中的Qt 按钮组。我会忽略它(多个按钮是一个按钮组?)但也有让我绊倒的

QButtonGroup

QButtonGroup 类提供了一个容器来组织按钮小部件组。

QButtonGroup 提供了一个抽象容器,可以在其中放置按钮小部件。它不提供此容器的可视化表示(有关容器小部件,请参阅 QGroupBox),而是管理组中每个按钮的状态。

(强调我的。)

因此,可以使用按钮组,例如保持单选按钮同步。它源自QObject,因此既不是 aQWidget也不是 a QLayout。因此,不适合将可见的子小部件添加到QOpenGLWidget.

虽然我没有使用 QCreator 的经验,但我认为它应该可以像在我的示例中一样在那里工作:

  1. 分配一个布局QOpenGLWidget(例如QGridLayout我在我的示例中所做的)。

  2. QPushButtons 添加到此布局中。

顺便提一句。恕我直言,这不是关于的具体问题QOpenGLWidget——它也应该发生在任何其他问题QWidget上。

于 2019-01-02T09:17:31.140 回答