今天及后面几天,小豆君主要来讲一下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,水平拉伸整个窗口,看有什么变化。
好的,关于容器控件今天先讲到这里,如果你想第一时间看到小豆君的技术分享,就赶快关注吧。
网友评论