Группа кнопок Qt поверх OpenGLWidget

Я разрабатываю пользовательский интерфейс с Qt Creator. У меня есть openGLwidget, который покрывает всю форму, и я хочу разместить несколько кнопок, выровненных по низу, и какие-то рамки уведомлений над виджетом. Есть ли способ сделать это по умолчанию?

Когда я пытался спроектировать это на создателе, я не мог избавиться от ограничений макета и не позволил мне поместить виджет поверх openglwidget.

1 ответ

Когда я сначала читал вопрос, я читал его как "Как сделать QOpenGLWidget с Head-Up Display кнопками? ".

Как сделать QOpenGLWidget с Head-Up Display (окрашены с QPainter), Я однажды ответил на SO: нарисовать прямоугольник на qglwidget в указанное время. Однако там была только живопись - никаких интерактивных виджетов.

Следовательно, я подготовил новый образец 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

Скомпилировано и протестировано в VS2013 на Windows 10:

Это на самом деле довольно легко - QOpenGLWidget происходит от QWidget, QWidget обеспечивает метод QWidget::setLayout(), Чтобы добавить дочерние виджеты, QLayout должен использоваться, который управляет расположением дочерних элементов в родительском виджете (и принимает участие в согласовании размера при размещении родительского виджета).

Чтобы было проще, я использовал QGridLayout где кнопки расположены в ячейках (1, 1), (1, 2) и (1, 3). Строка 0 и столбец 0 оставлены пустыми, но включены для объединения. Это приводит к эффективному прикреплению кнопок в правом нижнем углу.


Когда я собирался опубликовать этот ответ, я еще раз взглянул на вопрос и понял заголовок группы Qt Button. Я бы проигнорировал это (несколько кнопок - это группа кнопок?), Но есть также группа qbuttongroup, которая заставила меня споткнуться.

QButtonGroup:

Класс QButtonGroup предоставляет контейнер для организации групп виджетов кнопок.

QButtonGroup предоставляет абстрактный контейнер, в который могут быть помещены виджеты кнопок. Он не предоставляет визуальное представление этого контейнера (см. QGroupBox для виджета контейнера), но вместо этого управляет состояниями каждой из кнопок в группе.

(Подчеркните мой.)

Таким образом, можно использовать группу кнопок, например, для синхронизации кнопок. Это получено из QObject и, следовательно, ни QWidget ни QLayout, Таким образом, нельзя добавлять видимые дочерние виджеты в QOpenGLWidget,

Хотя у меня нет опыта работы с QCreator, я предполагаю, что он должен работать там же, как и в моем примере:

  1. Назначить макет QOpenGLWidget (например QGridLayout как я делал в моем образце).

  2. добавлять QPushButton с этим макетом.

Btw. ИМХО это не конкретная проблема по поводу QOpenGLWidget - это должно было случиться с любым другим QWidget также.

Другие вопросы по тегам