第八章 按键类控件
8.1 按钮基类 QAbstractButton
在QT中,多种按钮控件均继承自QAbstractButton,共享其基础属性与功能。
Dialog Button Box是特殊组合(两个QPushButton水平排列),非单一新控件。
这些按钮控件之间的继承关系如下图:
8.1.1 标题和图标
这些函数分别用于设置和获取QAbstractButton对象的文本内容、图标以及图标大小。
// 设置按钮文本
void QAbstractButton::setText(const QString &text);
// 获取按钮文本
QString QAbstractButton::text() const;
// 获取按钮图标
QIcon QAbstractButton::icon() const;
// 设置按钮图标
void QAbstractButton::setIcon(const QIcon &icon);
// 获取按钮图标大小
QSize QAbstractButton::iconSize() const;
// 设置按钮图标大小
void QAbstractButton::setIconSize(const QSize &size);
8.1.2 按钮的 Check 属性
按钮通常有三种状态:Normal(普通状态)、Hover(悬停状态)和Pressed(按压状态)。
按钮在鼠标按下时从 Normal切换到 Pressed状态,鼠标释放时恢复到 Normal状态。
若按钮设置了checkable属性,则行为有所不同:
//判断按钮是否设置了checkable属性。默认未设置(not checkable)。
void isCheckable() const;
//设置按钮的checkable属性。
//为true时,点击按钮后按钮保持Pressed状态,需再次点击才恢复Normal状态;
//为false时,行为默认。
void setCheckable(bool);
此外,还有与选中状态相关的函数:
//判断按钮是否被选中。
void isChecked() const;
//设置按钮的选中状态。需先设置checkable属性。
void setChecked(bool);
8.1.3 信号
按钮在被点击、快捷键键入或特定函数调用时,会发射不同的信号。
最常用的信号是clicked(),而pressed()和released()信号则分别对应按钮的按下和释放状态。
对于设置了check属性的按钮,其选中状态变化时会发射toggled()信号。
// 按钮被激活时发射
[signal] void QAbstractButton::clicked(bool checked = false);
// 按钮按下时发射
[signal] void QAbstractButton::pressed();
// 按钮释放时发射
[signal] void QAbstractButton::released();
// 可检查按钮状态改变时发射
[signal] void QAbstractButton::toggled(bool checked);
8.1.4 槽函数
QAbstractButton提供了多种槽函数,如animateClick()用于执行动画点击,click()用于模拟鼠标点击,setChecked()用于设置按钮的选中状态,setIconSize()用于设置图标大小,以及toggle()用于切换可检查按钮的状态。
// 执行动画点击,模拟点击时按键变灰松手变白,默认100毫秒
QAbstractButton::animateClick(int msec = 100);
// 模拟鼠标点击效果
QAbstractButton::click();
// 设置按钮的选中状态
QAbstractButton::setChecked(bool checked);
// 设置按钮上图标的大小
QAbstractButton::setIconSize(const QSize &size);
// 切换可检查按钮的状态
QAbstractButton::toggle();
8.2 QPushButton
8.2.1 QPushButton常用API
构造函数:
/*带图标、文本和父对象的构造函数*/
QPushButton(const QIcon &icon, // 按钮上显示的图标
const QString &text, // 按钮上显示的文本
QWidget *parent = nullptr); // 按钮的父对象,可不指定
/*只带文本和父对象的构造函数*/
QPushButton(const QString &text, // 按钮上显示的文本
QWidget *parent = nullptr); // 可选的父对象
/*只带父对象的构造函数*/
QPushButton(QWidget *parent = nullptr); // 可选的父对象,创建无文本的按钮
判断与设置默认按钮:
/*判断按钮是否为默认按钮*/
bool isDefault() const;
/*设置按钮为默认按钮(通常用于对话框,与Enter键关联)*/
void setDefault(bool);
关联与显示弹出菜单:
/*将弹出菜单与按钮关联,使按钮变为菜单按钮*/
void setMenu(QMenu *menu);
/*显示关联的弹出菜单*/
void showMenu();
8.2.2 按钮的使用
QPushButton的三种使用方式:
-
作为普通按钮, 可以显示文本信息和图标
-
设置 check 属性, 使其可以处于持续的被选中状态
-
关联一个菜单, 点击按钮菜单弹出
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyDialog md;
// 创建一个Ui::Widget实例,并初始化UI元素
Ui::MyDialog *ui = new Ui::MyDialog;
ui->setupUi(&md);
//普通按钮
ui->normalButton->setIcon(QIcon(":/img/icon.png"));//设置按键图标
ui->normalButton->setIconSize(QSize(70, 30));
md.connect(ui->normalButton,&QPushButton::clicked,[](){qDebug()<<"i'm a normalButton";});//点击事件关联槽函数
//受检按钮
ui->checkedButton->setCheckable(true);
md.connect(ui->checkedButton,&QPushButton::toggled,[](bool b1){qDebug()<<"state:"<<b1;});
//关联菜单
ui->menuButton->setText("xiao pig");
QMenu* menu = new QMenu;
QAction* act = menu->addAction("kaaide");
menu->addAction("taoqide");
menu->addAction("youzhide");
menu->addAction("youyiside");
ui->menuButton->setMenu(menu);
md.connect(act,&QAction::triggered,[=]{qDebug()<<"laiwanma";});
md.show();
return app.exec();
}

8.3 QToolButton
8.3.1 常用API
QToolButton 是Qt中的一个功能丰富的按钮控件,支持关联菜单和多种图标样式。
构造函数:创建一个QToolButton,可指定父控件。
QToolButton(QWidget *parent = nullptr);
菜单关联:
//关联菜单到按钮
setMenu(QMenu *menu);
//获取关联的菜单
menu() const;
弹出模式:控制菜单的弹出行为。
//设置弹出模式(延时、按钮点击或立即)
setPopupMode(ToolButtonPopupMode mode)
//获取当前弹出模式。
popupMode() const
箭头图标:在按钮上显示箭头。
//设置箭头类型
setArrowType(Qt::ArrowType type)
//获取箭头类型
arrowType() const;
关联动作:用于美化按钮。
//关联默认动作。
setDefaultAction(QAction *action);
//获取默认动作。
defaultAction() const;
图标和文本样式:控制按钮的显示样式。
//设置显示样式。
setToolButtonStyle(Qt::ToolButtonStyle style);
//获取当前显示样式。
toolButtonStyle() const;
显示菜单:手动触发显示关联菜单。
//显示菜单。
showMenu();
8.3.2 按钮的使用
QToolButton这种类型的按钮, 有三种使用方式:
1. 作为普通按钮, 可以显示文本信息和图标
2. 设置check属性, 使其可以处于持续的被选中状态
3. 关联一个菜单, 点击按钮菜单弹出, 并且可以设置菜单的弹出方式
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyDialog md;
// 创建一个Ui::Widget实例,并初始化UI元素
Ui::MyDialog *ui = new Ui::MyDialog;
ui->setupUi(&md);
QMenu *menu = new QMenu;
//QAction *act = new QAction(QIcon(":/img/icon.png"),"xx"); //设置功能栏图标
//QAction *act1 = new QAction(QIcon(":/img/icon.png"),"xx");//设置功能栏图标
QAction *act = new QAction("first");
QAction *act1 = new QAction("second");
menu->addAction(act);
menu->addAction(act1);
ui->toolButton->setMenu(menu);
ui->toolButton->setPopupMode(QToolButton::InstantPopup); // 设置弹出模式
/*绑定动作的触发信号和槽*/
md.connect(act,&QAction::triggered,[=](){qDebug()<<"this is first";});
md.connect(act1,&QAction::triggered,[=](){qDebug()<<"this is second";});
md.show();
return app.exec();
}
8.4 QRadioButton
QRadioButton是Qt中的单选按钮,通常成组使用,允许在多个按钮中选一个。
它继承自QAbstractButton类。需注意,已选中的单选按钮再次点击不会取消选中状态。
8.4.1 常用API
QRadioButton是Qt中的单选按钮,其构造函数可以接收标题和父对象作为参数,或者只接收父对象。若只提供父对象,则按钮无标题。
// 带有标题和父对象的单选按钮
QRadioButton *radio1 = new QRadioButton("Option 1", parentWidget);
// 仅带有父对象的单选按钮(无标题)
QRadioButton *radio2 = new QRadioButton(parentWidget);
8.4.2 按钮的使用
在同一窗口中,Qt会认为所有的单选按钮都属于同一组,如果需要多个单选按钮组,应该将他们放到不同的子窗口中。
如果我们使用鼠标点击了某个单选按钮,按钮还是会发射出 clicked()信号。
8.5 QCheckBox
8.5.1 常用API
QCheckBox是Qt中的复选框,可单独或成组使用,允许同时选中多个。与单选按钮不同,复选框点击后可切换选中状态。它继承自QAbstractButton类。
QCheckBox是Qt的复选框控件,可设选中、未选中及半选中状态,其中半选中适用于树状结构中的部分选中情况。
构造函数可设文本和父对象。
isTristate()判断是否为三态,setTristate()设置三态。
setCheckState()和checkState()分别用于设置和获取复选框状态。
QCheckBox *checkbox = new QCheckBox("Check me"); // 创建复选框
checkbox->setTristate(true); // 设置为三态
checkbox->setCheckState(Qt::PartiallyChecked); // 设置为半选中状态
Qt::CheckState state = checkbox->checkState(); // 获取当前状态
/*
参数 state, 枚举类型 Qt::CheckState:
- Qt::Unchecked --> 当前复选框没有被选中
- Qt::PartiallyChecked --> 当前复选框处于半选中状态, 部分被选中(三态复选框)
- Qt::Checked --> 当前复选框处于选中状态*/
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyDialog md;
QVBoxLayout layout(&md);
// 创建一个Ui::Widget实例,并初始化UI元素
md.ui->checkBox->setTristate(true);
md.ui->checkBox_2->setTristate(true);
md.ui->checkBox_3->setTristate(true);
md.ui->checkBox->setCheckState(Qt::PartiallyChecked);
md.ui->checkBox_2->setCheckState(Qt::PartiallyChecked);
md.ui->checkBox_3->setCheckState(Qt::PartiallyChecked);
md.connect(md.ui->checkBox,&QCheckBox::clicked,[](){qDebug()<<"this is check1";});
md.connect(md.ui->checkBox_2,&QCheckBox::clicked,[](){qDebug()<<"this is check2";});
md.connect(md.ui->checkBox_3,&QCheckBox::clicked,[](){qDebug()<<"this is check3";});
md.show();
return app.exec();
}
8.5.2 树状复选框
想做树状复选框需要使用到 TreeWidget 或者 TreeView组件。
QTreeWidget是QTreeView的简化版,适合初学者构建简单树形结构。对于复杂、大数据量的树形结构,应选用QTreeView。
构造函数
创建一个 QTreeWidget,可以指定父控件。
QTreeWidget(QWidget *parent = nullptr);
添加和获取项目
你可以向 QTreeWidget 中添加 QTreeWidgetItem 对象作为节点,并可以通过各种方法获取这些项目。
// 添加根节点
QTreeWidgetItem *rootItem = new QTreeWidgetItem(this);
rootItem->setText(0, "Root");
// 添加子节点
QTreeWidgetItem *childItem = new QTreeWidgetItem(rootItem);
childItem->setText(0, "Child");
// 获取根节点
QTreeWidgetItem *retrievedRoot = topLevelItem(0);
// 获取子节点数量
int childCount = rootItem->childCount();
// 通过索引获取第一个顶级项目
QTreeWidgetItem *rootItem = topLevelItem(0);
//通过父项目获取子项目
QTreeWidgetItem *childItem = rootItem->child(0); // 获取 rootItem 的第一个子项目
//通过当前选中项获取
QTreeWidgetItem *currentItem = this->currentItem(); // 获取当前选中的项目
遍历所有项目
你可以使用递归函数来遍历树中的所有项目。
void traverseTree(QTreeWidgetItem *item) {
if (item == nullptr) return;
// 处理当前项目
qDebug() << item->text(0); // 输出项目第0列的文本
// 递归处理子项目
for (int i = 0; i < item->childCount(); ++i) {
traverseTree(item->child(i));
}
}
// 使用方法:从每个顶级项目开始遍历
for (int i = 0; i < topLevelItemCount(); ++i) {
traverseTree(topLevelItem(i));
}
列操作
QTreeWidget 支持多列显示,你可以添加、删除和修改列。
// 设置列数
setColumnCount(2);
// 设置列标题
setHeaderLabels(QStringList() << "Column 1" << "Column 2");
// 获取列数
int columnCount = columnCount();
节点展开与折叠
你可以控制树中节点的展开和折叠状态。
// 展开所有节点
expandAll();
// 折叠所有节点
collapseAll();
// 展开特定节点
rootItem->setExpanded(true);
选择与当前项目
QTreeWidget 提供了丰富的选择模型,允许你获取和设置当前选中的项目。
// 获取当前选中的项目
QTreeWidgetItem *currentItem = currentItem();
// 设置为当前选中的项目
setCurrentItem(childItem);
排序与过滤
QTreeWidget 支持对项目进行排序和过滤,以满足不同的数据展示需求。
// 启用排序
setSortingEnabled(true);
// 设置排序列和排序顺序,比较的是text内容
sortByColumn(0, Qt::AscendingOrder);

通过给 TreeWidget设置一个 checkState属性,会自动呈现 CheckBox复选框的效果。

QTreeWidget绑定信号和槽函数
QTreeWidget下面有QTreeWidgetItem,但是QTreeWidgetItem并不提供信号和槽函数。
QTreeWidget提供 QTreeWidget::itemClicked(),作为 Item项的点击事件信号。
QTreeWidget提供 QTreeWidget::onItemClicked(),响应 Item项的点击事件槽函数。//此处没用到
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyDialog md;
QTreeWidgetItem *rootItem = md.ui->treeWidget->topLevelItem(0);
md.ui->treeWidget->connect(md.ui->treeWidget,
&QTreeWidget::itemClicked,
[](QTreeWidgetItem *item, int column){
if(item->text(column)=="新建项目"){
qDebug()<<"test ok";
}
;});
md.show();
return app.exec();
}
第九章 容器类控件
9.1 QWidget
QWidget是Qt中所有窗口和控件的基类,可独立使用或内嵌。为有序管理子窗口,可选QWidget作容器,并对其进行布局。
关于这些属性大部分都有对应的API函数, 在属性名前加 set 即可。
在Qt中也可以根据实际需求选择其他类型的容器,
9.2 Frame
QFrame是QWidget的增强版,它继承了QWidget的所有属性,提供了额外的功能,如设置边框样式、宽度和阴影,使容器窗口更具定制性和视觉吸引力。
9.2.1 相关API
QFrame是Qt中的一个类,它提供了丰富的边框样式和阴影效果。可以设置边框形状如NoFrame、Box、Panel等,并可选阴影样式如Plain、Raised、Sunken。同时,还可以调整边框线宽和中线宽来定制外观。
// 创建QFrame对象
QFrame *frame = new QFrame;
// 设置边框形状为面板
frame->setFrameShape(QFrame::Panel);
// 设置边框阴影为凸起
frame->setFrameShadow(QFrame::Raised);
// 设置边框线宽度为2
frame->setLineWidth(2);
// 设置中线宽度为1(影响阴影显示)
frame->setMidLineWidth(1);
9.2.2 属性设置
这个类的属性并不多, 都是关于边框的设置的。

9.3 Group Box
QGroupBox类的基类是QWidget, 在这种类型的窗口中可以绘制边框、给窗口指定标题, 并且还支持显示复选框。
9.3.1 相关API
// 创建一个QGroupBox对象,并设置标题
QGroupBox *groupBox = new QGroupBox("My Group Box");
// 设置组框为可选中状态
groupBox->setCheckable(true);
// 设置组框标题的对齐方式为居中对齐
groupBox->setAlignment(Qt::AlignCenter);
// 检查组框的选中状态
bool isChecked = groupBox->isChecked();
// 设置组框的选中状态为true
groupBox->setChecked(true);
9.3.2 属性设置
关于组框的属性对应的就是上边介绍的那几个API函数, 属性窗口如下:

组框中的flat属性没有对应的API函数, 只能在属性窗口中设置, 它控制的是窗口边框的绘制方式, 如果打开该属性, 组框的边框就消失了。
9.4 Scroll Area
QScrollArea是Qt中的滚动容器,允许动态添加或移除子窗口。
主要API有setWidget()用于添加子窗口,takeWidget()用于移除并返回被删除的子窗口。同时,可以设置子窗口的对齐方式和是否自动调节大小。
// 创建QScrollArea对象
QScrollArea *scrollArea = new QScrollArea;
// 将子窗口添加到滚动区域
scrollArea->setWidget(QWidget::childWidget);
// 设置子窗口的对齐方式为居中
scrollArea->setAlignment(Qt::AlignCenter);
// 允许滚动区域自动调整子窗口大小
scrollArea->setWidgetResizable(true);
// ... 后续代码,如添加布局、显示窗口等
// 在需要时,可以从滚动区域中移除子窗口
QWidget *removedWidget = scrollArea->takeWidget();
// 注意:此时removedWidget指向之前添加的子窗口,且它已被从滚动区域中移除
9.4.2 属性设置

9.5 Tool Box
QToolBox是一个工具箱控件,可存储多个子窗口,实现抽屉效果。
9.5.1 相关API
构造函数
QToolBox(QWidget *parent = nullptr, //父指针
Qt::WindowFlags f = Qt::WindowFlags()); //窗口标志,设置外观和行为
信号:
currentChanged(int index): 当前选项卡变化时发射。
槽函数:
setCurrentIndex(int index): 设置当前显示的选项卡索引。
setCurrentWidget(QWidget *widget): 设置当前显示的子窗口对象。
QToolBox *toolBox = new QToolBox(this);
QWidget *widget1 = new QWidget();
QWidget *widget2 = new QWidget();
// 添加选项卡
toolBox->addItem(widget1, QIcon("icon1.png"), "Tab 1");
toolBox->addItem(widget2, "Tab 2");
// 插入选项卡
toolBox->insertItem(1, new QWidget(), QIcon("icon3.png"), "Inserted Tab");
// 移除选项卡
toolBox->removeItem(2);
// 设置选项卡属性
toolBox->setItemEnabled(0, false);
toolBox->setItemIcon(0, QIcon("newIcon.png"));
// 获取当前选项卡和子窗口
int currentIndex = toolBox->currentIndex();
QWidget *currentWidget = toolBox->currentWidget();
// 连接信号和槽
connect(toolBox, &QToolBox::currentChanged, [](int index){
qDebug() << "Current index changed to:" << index;
});
// 设置当前显示的选项卡
toolBox->setCurrentIndex(1);
toolBox->setCurrentWidget(widget2);
/*拖动设计好原始界面,再代码改*/
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyDialog md;
/*工具盒中选项卡的内容可以通过标签或者其他容器添加*/
md.ui->toolBox->setItemIcon(0,QIcon(":/img/icon.png"));
QLabel* label1 = new QLabel("工具选项1", &md);
QLabel* label2 = new QLabel("工具选项2", &md);
QLabel* label3 = new QLabel("工具选项3", &md);
// 向工具盒中添加标签
md.ui->toolBox->addItem(label1, "选项1");
md.ui->toolBox->addItem(label2, "选项2");
md.ui->toolBox->addItem(label3, "选项3");
md.connect(md.ui->toolBox,&QToolBox::currentChanged,[](int index){qDebug()<<"this is"<<index;});
md.show();
return app.exec();
}
9.5.2 属性设置

9.6 Tab Widget
QTabWidget是Qt框架中的带标签页的窗口组件,用于管理多个子窗口。
每个标签页都可以包含不同的窗口部件,例如文本编辑器、图片查看器、表格或其他自定义窗口部件。
9.6.1 相关API
构造函数
QTabWidget::QTabWidget(QWidget *parent = Q_NULLPTR);
选项卡管理
/*添加选项卡*/
int addTab(QWidget *page, // 指向要添加的QWidget页面的指针
const QString &label); // 标签的文本内容
int addTab(QWidget *page, // 指向要添加的QWidget页面的指针
const QIcon &icon, // 要显示的图标
const QString &label); // 标签的文本内容
/*插入选项卡*/
int insertTab(int index, QWidget *page, const QString &label);
int insertTab(int index, QWidget *page, const QIcon &icon, const QString &label);
/*删除选项卡*/
void removeTab(int index);
/*清空所有选项卡*/
void clear();
选项卡信息查询
//选项卡数量
int count() const;
//当前选项卡索引
int currentIndex() const;
//当前选项卡窗口
QWidget *currentWidget() const;
//获取特定索引的选项卡窗口:
QWidget *widget(int index) const;
信号
/*当前页索引改变时发出*/
[signal] void QTabWidget::currentChanged(int index);//新当前页索引,无新索引时为-1
/*用户单击选项卡时发出*/
[signal] void QTabWidget::tabBarClicked(int index);//被单击选项卡的索引,无选项卡时为-1
/*用户双击选项卡时发出*/
[signal] void QTabWidget::tabBarDoubleClicked(int index);//被双击选项卡的索引,无选项卡时为-1。
/*用户单击选项卡关闭按钮时发出*/
[signal] void QTabWidget::tabCloseRequested(int index);//选项卡索引,无时-1
槽函数
/*设置显示选项卡对应索引的标签页*/
[slot] void QTabWidget::setCurrentIndex(int index);//选项卡索引
/*设置显示选项卡中子窗口的内容*/
[slot] void QTabWidget::setCurrentWidget(QWidget *widget);//子窗口

9.6.2 属性设置

9.7 Stacked Widget
QStackedWidget是一个栈类型窗口,可存储多个子窗口,但仅显示一个。
9.7.1 相关API
构造函数
QStackedWidget::QStackedWidget(QWidget *parent = Q_NULLPTR);
公共成员函数
//添加子窗口,返回索引
int addWidget(QWidget *widget);
//插入子窗口到指定索引
int insertWidget(int index, QWidget *widget);
//删除子窗口
void removeWidget(QWidget *widget);
//子窗口数量
int count() const;
//当前显示子窗口索引
int currentIndex() const;
//当前显示子窗口指针
QWidget *currentWidget() const;
//根据索引获取子窗口指针
QWidget *widget(int index) const;
//根据子窗口指针获取索引
int indexOf(QWidget *widget) const;
信号
//切换显示子窗口时发射,带索引
[signal] void currentChanged(int index);
//子窗口被删除时发射,带索引
[signal] void widgetRemoved(int index);
槽函数
//根据索引设置当前显示子窗口
[slot] void setCurrentIndex(int index);
//根据指针设置当前显示子窗口
[slot] void setCurrentWidget(QWidget *widget);


9.7.2 属性设置

4929

被折叠的 条评论
为什么被折叠?



