我正在使用 Qt Creator 设计用户界面。我有一个覆盖所有表单的openGLwidget,我想在小部件上放置一些与底部对齐的按钮和某种通知框架。有没有默认的方法来做到这一点?
当我尝试在创建者上进行设计时,我无法摆脱布局限制并且不允许我将小部件放置在 openglwidget 上。
我正在使用 Qt Creator 设计用户界面。我有一个覆盖所有表单的openGLwidget,我想在小部件上放置一些与底部对齐的按钮和某种通知框架。有没有默认的方法来做到这一点?
当我尝试在创建者上进行设计时,我无法摆脱布局限制并且不允许我将小部件放置在 openglwidget 上。
第一次阅读问题时,我将其阅读为“如何制作QOpenGLWidget
带有按钮的平视显示器?”。
How to make a QOpenGLWidget
with 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 编译测试:
它实际上很容易——QOpenGLWidget
源自QWidget
. QWidget
提供方法QWidget::setLayout()
。要添加子小部件,QLayout
应该使用 a 来管理父小部件中子小部件的布局(并在父小部件布局时参与大小协商)。
为了简单起见,我使用了一个QGridLayout
where 按钮被放置在单元格 (1, 1)、(1, 2) 和 (1, 3) 中。第 0 行和第 0 列留空,但可以进行拉伸。这可以有效地将按钮附加在右下角。
当我即将发布这个答案时,我再次查看了这个问题,并意识到标题中的Qt 按钮组。我会忽略它(多个按钮是一个按钮组?)但也有让我绊倒的qbuttongroup 。
QButtonGroup 类提供了一个容器来组织按钮小部件组。
QButtonGroup 提供了一个抽象容器,可以在其中放置按钮小部件。它不提供此容器的可视化表示(有关容器小部件,请参阅 QGroupBox),而是管理组中每个按钮的状态。
(强调我的。)
因此,可以使用按钮组,例如保持单选按钮同步。它源自QObject
,因此既不是 aQWidget
也不是 a QLayout
。因此,不适合将可见的子小部件添加到QOpenGLWidget
.
虽然我没有使用 QCreator 的经验,但我认为它应该可以像在我的示例中一样在那里工作:
分配一个布局QOpenGLWidget
(例如QGridLayout
我在我的示例中所做的)。
将QPushButton
s 添加到此布局中。
顺便提一句。恕我直言,这不是关于的具体问题QOpenGLWidget
——它也应该发生在任何其他问题QWidget
上。