今天及后面几天,小豆君主要来讲一下Qt其它常用控件的用法。主要包括:
- 容器控件
- 按钮控件
- 输入控件
- 显示控件
显示控件的QOpenGLWidget和QQuickWidget等讲到绘图和QML时,小豆君再进行介绍。
本节先来介绍容器控件。
所谓容器控件,顾名思义,就是在ui中,可以将其他控件拖入到容器控件上。主要的容器控件有:QWidget,QFrame,QScrollArea,QGroupBox,QTabWidget,QToolBox,QStackedWidget,QDockWidget。
QWidget已经讲过,QDockWidget留在讲主窗口(QMainWindow)时再介绍。
2.6.1 QFrame
在2.2 QWidget一节中,小豆君讲了如何在帮助文档中查看一个类,首先需要看描述,其次看属性,最后看接口。好,我们按照这个顺序来看一下QFrame。
看完描述,我们知道QFrame其实就是一个带边框的QWidget,既然是边框,那么边框就会有宽度,阴影和形状,从而它就会使得从视觉上有一种突起或凹陷的效果。
再来看QFrame的属性
属性都很简单,我就不详细介绍了。
其中要注意的是midLineWidth,中间线宽可能有的人不理解。当绘制一个有凸起或凹陷效果的边框时,Qt用里,中,外三条线加上线与线之间的不同明暗颜色来进行特化。如下图,中间的那条线就是midLine。
QFrame的接口函数都很简单,这里就不介绍了。
2.6.2 QScrollArea
当一个窗口很大时,在显示器上无法显示整个窗口,那么Qt提供了一个叫作滚动窗口类QScrollArea,它提供了一个垂直和水平的滚动条,用以浏览整个窗口。
QScrollArea(滚动区域)继承自QAbstractScrollArea,在Qt中,凡是带有Abstract字样的都是抽象类,但抽象类并不一定全是带有Abstract字样。
滚动区域在它的中心提供了一个视口,而窗口就通过该视口显示,可以通过设置滚动条的显隐策略来控制其显隐。
QAbstractScrollArea的新增属性:
水平滚动策略,垂直滚动策略:
- Qt::ScrollBarAsNeeded:当视口无法完全显示窗口时,显示滚动条,否则不显示。
- Qt::ScrollBarAlwaysOff:不显示滚动条。
- Qt::ScrollBarAlwaysOn:无论如何都显示滚动条。
SizeAdjustPolicy:
- QAbstractScrollArea::AdjustIgnored:视口改变大小,滚动区域并不改变大小
- QAbstractScrollArea::AdjustToContents:视口改变大小,滚动区域也改变大小
- QAbstractScrollArea::AdjustToContentsOnFirstShow:在第一次显示时就改变滚动区域的大小
当想要将滚动条定位到某个位置时,可以获取水平或垂直滚动条指针,并调用setValue()接口。
2.6.3 QGroupBox
当我们的多个控件表示同一类操作或显示时,我们希望将这些控件用一个矩形框包起来,QGroupBox就提供了这样的功能。
我们来看一下QGroupBox的属性:
标题位置 alignment:
- Qt::AlignLeft:左侧
- Qt::AlignRight:右侧
- Qt::AlignHCenter:中间
- Qt::AlignJustify:选择合适的空间。
是否需要扁平化处理flat:
- true:只显示标题处的一行直线
- false:显示整个矩形框。
是否可选checkable,已经被选中:
- 标题旁有一个勾选框,当被勾选时QGroupBox为可用状态,否则不可用。
标题title
2.6.4 示例
下面小豆君专门写了一个示例帮助大家理解以上三个类
新建一个空的qmake项目ContainerWidget1,pro文件中添加
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = ContainerWidget1 TEMPLATE = app
添加一个ContainerFrame界面类
编辑界面,并将控件都加入到布局管理器中
containerframe.h
#ifndef CONTAINERFRAME_H #define CONTAINERFRAME_H #include <QFrame> namespace Ui { class ContainerFrame; } class ContainerFrame : public QFrame { Q_OBJECT public: explicit ContainerFrame(QWidget *parent = 0); ~ContainerFrame(); private slots: void on_combo_h_currentIndexChanged(int index); void on_combo_v_currentIndexChanged(int index); void on_combo_size_currentIndexChanged(int index); void on_comboBox_aligment_currentIndexChanged(int index); void on_checkBox_flat_toggled(bool checked); private: Ui::ContainerFrame *ui; }; #endif // CONTAINERFRAME_H
containerframe.cpp
#include <QDebug> #include <QtMath> #include <QGroupBox> #include <QScrollArea> #include "containerframe.h" #include "ui_containerframe.h" ContainerFrame::ContainerFrame(QWidget *parent) : QFrame(parent), ui(new Ui::ContainerFrame) { ui->setupUi(this); /*1 QFrame设置*/ setFrameShadow(Raised); setFrameShape(Box); setMidLineWidth(5); setLineWidth(2); /*2 QScrollArea设置*/ //创建label,作为滚动区域的中心部件,用视口便可以看到它。 //设置label最小宽度和高度,以便可以有滚动条出现。 QLabel* label = new QLabel("滚动\n区域\n需要\n显示\n我"); label->setMinimumHeight(500); label->setMinimumWidth(600); ui->scrollArea->setWidget(label); //滚动条属性 QStringList textList; textList << "ScrollBarAsNeeded" <<"ScrollBarAlwaysOff" << "ScrollBarAlwaysOn"; ui->combo_h->addItems(textList); ui->combo_v->addItems(textList); //SizeAdjustPolicy textList.clear(); textList << "AdjustIgnored" << "AdjustToContentsOnFirstShow" << "AdjustToContents"; ui->combo_size->addItems(textList); /*3 QGroupBox设置*/ ui->groupBox_display->setCheckable(true); ui->groupBox_group->setChecked(true); //alignment textList.clear(); textList << "AlignLeft" <<"AlignRight" << "AlignHCenter" << "AlignJustify"; ui->comboBox_aligment->addItems(textList); } ContainerFrame::~ContainerFrame() { delete ui; } void ContainerFrame::on_combo_h_currentIndexChanged(int index) { ui->scrollArea->setHorizontalScrollBarPolicy((Qt::ScrollBarPolicy)index); } void ContainerFrame::on_combo_v_currentIndexChanged(int index) { ui->scrollArea->setVerticalScrollBarPolicy((Qt::ScrollBarPolicy)index); } void ContainerFrame::on_combo_size_currentIndexChanged(int index) { ui->scrollArea->setSizeAdjustPolicy((QAbstractScrollArea::SizeAdjustPolicy)index); } void ContainerFrame::on_comboBox_aligment_currentIndexChanged(int index) { ui->groupBox_display->setAlignment(qPow(2, index)); } void ContainerFrame::on_checkBox_flat_toggled(bool checked) { ui->groupBox_display->setFlat(checked); }
main.cpp
#include "containerframe.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); ContainerFrame w; w.show(); return a.exec(); }
现在运行程序,切换每个combobox的条目,看都有什么变化
设置SizeAdjustPolicy为AdjustToContents,水平拉伸整个窗口,看有什么变化。
好的,关于容器控件今天先讲到这里,如果你想第一时间看到小豆君的技术分享,就赶快关注吧。
欢迎关注小豆君的微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。