Группа кнопок Qt поверх OpenGLWidget - PullRequest
0 голосов
/ 30 декабря 2018

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

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

1 Ответ

0 голосов
/ 02 января 2019

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

Как сделать QOpenGLWidget с Head-Up Display(закрашено QPainter), я однажды ответил в ТАК: Рисуем прямоугольник на 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:

Snapshot of testQGLWidgetHUDButtons in Windows 10

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

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


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

A QButtonGroup:

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

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

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

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

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

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

  2. Добавьте QPushButton s к этому макету.

Кстати.ИМХО, это не особая проблема с QOpenGLWidget - он должен был произойти с любым другим QWidget.

...