Когда я сначала читал вопрос, я читал его как «Как сделать 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:
На самом деле это довольно просто - QOpenGLWidget
является производным от QWidget
.QWidget
предоставляет метод QWidget::setLayout()
.Чтобы добавить дочерние виджеты, следует использовать QLayout
, который управляет макетом дочерних элементов в родительском виджете (и принимает участие в согласовании размера, когда родительский виджет размещен).
Для простоты я использовал QGridLayout
где кнопки расположены в ячейках (1, 1), (1, 2) и (1, 3).Строка 0 и столбец 0 оставлены пустыми, но включены для объединения.Это эффективно приводит к прикреплению кнопок в правом нижнем углу.
Когда я собирался опубликовать этот ответ, я еще раз взглянул на вопрос и понял Группа кнопок Qt в заголовке.Я бы проигнорировал это (несколько кнопок - это группа кнопок?), Но есть также qbuttongroup , которая заставила меня споткнуться.
A QButtonGroup
:
Класс QButtonGroup предоставляет контейнер для организации групп виджетов кнопок.
QButtonGroup предоставляет абстрактный контейнер, в который можно помещать виджеты кнопок. Он не обеспечивает визуальное представление этого контейнера (см. QGroupBox для виджета контейнера) , но вместо этого управляет состояниями каждой из кнопок в группе.
(Подчеркнуть)мой.)
Таким образом, можно использовать группу кнопок, например, для синхронизации переключателей.Он получен из QObject
и, следовательно, ни QWidget
, ни QLayout
.Таким образом, не подходит добавлять видимые дочерние виджеты в QOpenGLWidget
.
. Хотя у меня нет опыта работы с QCreator, я предполагаю, что он должен работать там же, как и в моем примере:
Назначьте макет для QOpenGLWidget
(например, QGridLayout
, как я делал в моем примере).
Добавьте QPushButton
s к этому макету.
Кстати.ИМХО, это не особая проблема с QOpenGLWidget
- он должен был произойти с любым другим QWidget
.