点击上方蓝字关注我们
7.6 treeWidget树形控件
QTreeWidget类使用预定义的树模型,提供了一个树型视图。这个类是基于Qt的模型/视图的体系结构,使用了一个默认的模型条目,每一个条目都是由一个QTreeWidgetItem类表示。当不需要使用到复杂的QTreeView特性的时候,我们可以直接使用QTreeWidget代替。 如果需要使用很复杂的模型/视图框架时,可以使用QTreeView标准模型。以下是QTreeWidget树形图使用效果图:
图7-6-1 QTreeWidget视图
7.6.1 创建QTreeWidget视图
-
在ui设计师界面有QTreeWidget控件,可视化创建比较简单。
图7-6-2 QTreeWidget控件使用
#include <QApplication>
#include <QTreeWidget>
#include <QHBoxLayout>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTreeWidget *tree = new QTreeWidget;
tree->setColumnCount(1);
QStringList headers;
headers << QObject::tr("名称") <<QObject::tr("修改时间")<<QObject::tr("类型")<<QObject::tr("大小");
tree->setHeaderLabels(headers); //设置头部显示的标签
QStringList disk_D;
disk_D << QObject::tr("本地磁盘(D)");
QTreeWidgetItem *disk_D_item = new QTreeWidgetItem(tree, disk_D);//创建条目
QStringList file_1;
file_1 << QObject::tr("1.png")
<< QObject::tr("2016/10/01 10:20")<<QObject::tr("文件")<<QObject::tr("1024kb");
QTreeWidgetItem *leaf1 = new QTreeWidgetItem(disk_D_item, file_1);
disk_D_item->addChild(leaf1); //添加子节点
QStringList file_2;
file_2 << QObject::tr("2.png")
<< QObject::tr("2016/10/01 10:30")<<QObject::tr("文件")<<QObject::tr("224kb");
QTreeWidgetItem *leaf2 = new QTreeWidgetItem(disk_D_item, file_2);
disk_D_item->addChild(leaf2); //添加子节点
QStringList disk_C;
disk_C << QObject::tr("本地磁盘(C)");
QTreeWidgetItem *disk_C_item = new QTreeWidgetItem(tree, disk_C);//创建条目
QStringList file_3;
file_3 << QObject::tr("1.png")
<< QObject::tr("2016/10/01 10:40")<<QObject::tr("文件")<<QObject::tr("24kb");
QTreeWidgetItem *leaf3 = new QTreeWidgetItem(disk_C_item, file_3);
disk_C_item->addChild(leaf3); //添加子节点
QStringList file_4;
file_4 << QObject::tr("2.png")
<< QObject::tr("2016/10/01 10:50")<<QObject::tr("文件")<<QObject::tr("40kb");
QTreeWidgetItem *leaf4 = new QTreeWidgetItem(disk_C_item, file_4);
disk_C_item->addChild(leaf4); //添加子节点
/*添加条目到树形视图*/
tree->addTopLevelItem(disk_D_item);
tree->addTopLevelItem(disk_C_item);
QHBoxLayout *mainlayout = new QHBoxLayout;
mainlayout->addWidget(tree);
QWidget *widget = new QWidget;
widget->setLayout(mainlayout);
widget->setWindowTitle(QObject::tr("QTreeWidget Demo"));
widget->show();
return a.exec();
}
|
图7-6-3 QTreeWidget视图
7.6.2 QTreeWidgetItem类相关函数介绍
1. 设置列编号
int columnCount() const;
void setColumnCount(int columns);
|
列编号默认为1。示例:
QTreeWidget *tree = new QTreeWidget;
tree->setColumnCount(10);
|
图7-6-4 列编号
2. 添加顶部节点树
void QTreeWidget::addTopLevelItem(QTreeWidgetItem *item) //添加
void QTreeWidget::insertTopLevelItem(int index, QTreeWidgetItem *item) //插入
int topLevelItemCount() const; //获取顶部节点的数量
|
addTopLevelItem函数按照顺序添加,insertTopLevelItem函数通过index索引值插入到指定位置。
图7-6-5 添加顶部树节点
3. 获取顶部节点指针
QTreeWidgetItem *topLevelItem(int index) const;
|
根据顶部节点的索引值,获取节点的QTreeWidgetItem指针。注意:索引值都是从0开始计算。示例:
QTreeWidgetItem *item=tree->topLevelItem(0); //返回索引值为0的QTreeWidgetItem节点指针
|
4. 返回节点的索引值
int indexOfTopLevelItem(QTreeWidgetItem *item) const;
|
返回已经存在的QTreeWidgetItem节点索引值。示例:
tree->indexOfTopLevelItem(disk_D_item); //返回disk_D_item节点的索引值。
|
5. 移除指定索引位置的节点
QTreeWidgetItem *takeTopLevelItem(int index);
|
移除节点后,返回该节点的指针。可以根据指针彻底删除节点占用的空间。
6. 设置头部标签
void QTreeWidget::setHeaderLabels(const QStringList &labels)
|
示例:
QStringList headers;
headers << QObject::tr("名称") <<QObject::tr("修改时间")<<QObject::tr("类型")<<QObject::tr("大小");
tree->setHeaderLabels(headers); //设置头部显示的标签
|
图7-6-6 头部标签顶
7. 设置当前选中的节点
QTreeWidgetItem *currentItem() const; //返回当前选中的节点指针
void setCurrentItem(QTreeWidgetItem *item); //设置当前选中的节点
void setCurrentItem(QTreeWidgetItem *item, int column);
void setCurrentItem(QTreeWidgetItem *item, int column, QItemSelectionModel::SelectionFlags command);
int currentColumn() const; //获取当前选中的列(头部)
|
setCurrentItem函数是一个重载函数,column参数表示选中的列位置。
图7-6-7 column参数设置的列位置
8. 滚动视图
void scrollToItem(const QTreeWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible);
|
QAbstractItemView::EnsureVisible
|
滚动指定条目到能显示出来的位置,只要能显示即可,位置不限。
|
QAbstractItemView::PositionAtTop
|
滚动指定条目到可视区域的顶部。
|
QAbstractItemView::PositionAtBottom
|
滚动指定条目到可视区域的底部。
|
QAbstractItemView::PositionAtCenter
|
滚动指定条目到可视区域中间。
|
9. 常用的信号
void itemPressed(QTreeWidgetItem *item, int column); //鼠标按下某个节点时发出
void itemClicked(QTreeWidgetItem *item, int column); //单击节点发出
void itemDoubleClicked(QTreeWidgetItem *item, int column); //双击节点发出
|
7.6.3 QTreeWidgetItem类函数介绍
QTreeWidgetItem类是一个描述QTreeWidget节点信息的视图类。每一行通常包含多个列的数据,每一列可以包含一个文本标签和图标。
1. 构造函数
QTreeWidgetItem(int type = Type)
QTreeWidgetItem(const QStringList &strings, int type = Type)
QTreeWidgetItem(QTreeWidget *parent, int type = Type)
QTreeWidgetItem(QTreeWidget *parent, const QStringList &strings, int type = Type)
QTreeWidgetItem(QTreeWidget *parent, QTreeWidgetItem *preceding, int type = Type)
QTreeWidgetItem(QTreeWidgetItem *parent, int type = Type)
QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type = Type)
QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *preceding, int type = Type)
QTreeWidgetItem(const QTreeWidgetItem &other)
|
QTreeWidgetItem的构造函数原型较多,可通过形参类型区分功能。其中type用来指定类型,后面可以使用int type() const函数获取设置的类型。构造QTreeWidgetItem 时可以指定QTreeWidget ,不需要调用addTopLevelItem函数。
示例:
QTreeWidget *tree = new QTreeWidget;
QTreeWidgetItem *item = new QTreeWidgetItem(tree);
item->setText(0,"item1");
tree->addTopLevelItem(item);
|
2. 设置指定列中显示的文本
QString QTreeWidgetItem::text(int column) const
void QTreeWidgetItem::setText(int column, const QString &text)
int QTreeWidgetItem::columnCount() const //返回列的数量
|
Column属性保存着列的位置。
示例:
QTreeWidget *tree = new QTreeWidget;
tree->setColumnCount(3);
QTreeWidgetItem *item = new QTreeWidgetItem(tree);
item->setText(0,"第0列");
item->setText(1,"第1列");
item->setText(2,"第2列");
|
3. 设置指定列中显示的图标
void QTreeWidgetItem::setIcon(int column, const QIcon &icon)
QIcon QTreeWidgetItem::icon(int column) const
|
Column属性保存着列的位置。
示例:
QTreeWidget *tree = new QTreeWidget;
tree->setColumnCount(3);
QTreeWidgetItem *item = new QTreeWidgetItem(tree);
item->setText(0,"第0列");
item->setText(1,"第1列");
item->setText(2,"第2列");
item->setIcon(0,QIcon(":/image/0.ico"));
item->setIcon(1,QIcon(":/image/1.ico"));
item->setIcon(2,QIcon(":/image/2.ico"));
|
4. 添加子节点
void QTreeWidgetItem::addChild(QTreeWidgetItem *child) //添加子节点
void QTreeWidgetItem::insertChild(int index, QTreeWidgetItem *child) //插入子节点
void QTreeWidgetItem::addChildren(const QList<QTreeWidgetItem *> &children) //添加子节点列表
void QTreeWidgetItem::insertChildren(int index, const QList<QTreeWidgetItem *> &children) //插入子节点列表
|
示例:
QTreeWidget *tree = new QTreeWidget;
QStringList headers;
headers << QObject::tr("名称");
tree->setHeaderLabels(headers); //设置头部显示的标签
QTreeWidgetItem *item = new QTreeWidgetItem(tree);
item->setText(0,"本地磁盘D");
QTreeWidgetItem *item1 = new QTreeWidgetItem;
item1->setText(0,"图片文件夹");
QTreeWidgetItem *item1_1 = new QTreeWidgetItem;
item1_1->setText(0,"a.png");
item1->addChild(item1_1);
QTreeWidgetItem *item2 = new QTreeWidgetItem;
item2->setText(0,"音乐文件夹");
QTreeWidgetItem *item2_1 = new QTreeWidgetItem;
item2_1->setText(0,"马頔 - 南山南.mp3");
item2->addChild(item2_1);
item->addChild(item1);
item->addChild(item2);
|
图7-6-8 添加子节点
5. 卸载节点
void QTreeWidgetItem::removeChild(QTreeWidgetItem *child) //卸载指定的项目节点
QTreeWidgetItem *QTreeWidgetItem::takeChild(int index) //清除指定索引位置的节点,并返回节点指针
QList<QTreeWidgetItem *> QTreeWidgetItem::takeChildren() //清除节点。并返回该节点的子节点列表。
int QTreeWidgetItem::childCount() const //返回子节点的数量
|
以上函数不会彻底删除QTreeWidgetItem节点,需要根据返回的指针彻底删除节点。
6. 设置指定列显示的字体
void QTreeWidgetItem::setFont(int column, const QFont &font)
QFont QTreeWidgetItem::font(int column) const
|
7. 设置复选框状态
void QTreeWidgetItem::setCheckState(int column, Qt::CheckState state) //设置复选框状态
Qt::CheckState QTreeWidgetItem::checkState(int column) cons //检查复选框状态
|
状态枚举值如下:
Qt::Unchecked
|
未选中
|
Qt::PartiallyChecked
|
三态选中
|
Qt::Checked
|
选中
|
图7-6-9 设置复选框状态
8. 设置状态
void QTreeWidgetItem::setFlags(Qt::ItemFlags flags)
Qt::ItemFlags QTreeWidgetItem::flags() const
|
状态枚举值参考7.5.3小节QListWidgetItem介绍。
9. 设置工具提示
void QTreeWidgetItem::setToolTip(int column, const QString &toolTip)
QString QTreeWidgetItem::toolTip(int column) const
|
10. 设置状态栏提示
void QTreeWidgetItem::setStatusTip(int column, const QString &statusTip)
QString QTreeWidgetItem::statusTip(int column) const
|
前提是主窗口要有状态栏。
11. 获取当前节点包含的所有子节点
QTreeWidget *QTreeWidgetItem::treeWidget() const
|
7.6.4 QTreeWidget运用示例
以下使用QTreeWidget实现查看文件信息的方式,类似于windows下资源管理器中查看文件信息的列表。通过该例子主要学会QTreeWidget的用法。(配套程序编号CH7-4)
1. widget.ui文件
2. widget.cpp文件代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
#include <QDir>
#include <QDateTime>
#include <QTreeWidget>
#include <QTreeWidgetItem>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置头部显示的标签
QStringList headers;
headers << QObject::tr("名称")
<<QObject::tr("最后修改时间")<<QObject::tr("最后访问时间")<<QObject::tr("类型")<<QObject::tr("字节大小");
ui->treeWidget->setHeaderLabels(headers);
//创建顶部节点
Headdisk=new QTreeWidgetItem(ui->treeWidget);//创建条目
ui->lineEdit_inputText->setText("D:/QtExample/treeWidget/treeWidget");
}
Widget::~Widget()
{
delete ui;
}
//打开目录
void Widget::on_pushButton_opendir_clicked()
{
QString address=ui->lineEdit_inputText->text();
if(address.isEmpty())
{
QMessageBox::warning(this, tr("错误提示"),
tr("请输入目录路径"),
QMessageBox::Ok);
return;
}
//构造目录
QDir dir(address);
if(dir.exists()!=true)
{
QMessageBox::warning(this, tr("错误提示"),
tr("输入的路径不存在!"),
QMessageBox::Ok);
return;
}
Headdisk->setText(0,dir.absolutePath());
//获取子节点的数量,用于释放之前存在的节点
if(Headdisk->childCount())
{
QList<QTreeWidgetItem *> list=Headdisk->takeChildren();
for(int i=0;i<list.count();i++)
{
Headdisk->removeChild(list.at(i)); //卸载节点
delete list.at(i); //删除节点
}
}
//遍历目录
QStringList infolist = dir.entryList(QDir::NoDotAndDotDot | QDir::AllEntries);
for(int i=0; i<infolist.count(); i++)
{
//创建子节点
QTreeWidgetItem *leaf= new QTreeWidgetItem(Headdisk);
QString str=dir.absolutePath();
str+="/";
str+=infolist.at(i);
QFileInfo info(str); //取出单个文件
QDateTime time_1=info.lastModified(); //最后修改时间
QDateTime time_2=info.lastRead(); //最后访问时间
leaf->setText(1,time_1.toString("yyyy-MM-dd hh:mm:ss")); //最后修改时间
leaf->setText(2,time_2.toString("yyyy-MM-dd hh:mm:ss")); //最后访问时间
leaf->setText(0, info.fileName());//文件名称
if(info.isFile()) //判断是否是文件
{
leaf->setText(3,tr("文件")); //文件类型
leaf->setText(4,tr("").number(info.size())); //文件字节大小
}
if(info.isDir())//判断是否是目录
{
leaf->setText(3,tr("目录")); //文件类型
leaf->setIcon(0,QIcon(":/image/0.ico"));
}
}
}
|
主要的功能代码集中在按钮的点击槽函数里,进行创建子节点。
图7-6-10 文件信息查看
7.7 QTableWidget表格控件
QTableWidget类提供了一个基于表格视图显示的样式。表格显示的内容由QTableWidgetItem类进行描述,详细可以看QTableWidgetItem类用法。表格条目不单单有文本,也有自己的图标、复选框等特性。
以下是QTableWidge控件的样式图:
7.7.1 创建QTableWidgetItem表格
#include <QApplication>
#include <QTableWidget>
#include <QHBoxLayout>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//构造一个QTableWidget类的实体对象tableWidget
QTableWidget *tableWidget = new QTableWidget;
tableWidget->setRowCount(7);//设置行数为7
tableWidget->setColumnCount(5);//设置列数为5
tableWidget->setGeometry(QRect(0,0,700,300));//设置tableWidget的大小
tableWidget->setItem(0,0,new QTableWidgetItem("毛球"));//第一行第一列的内容
tableWidget->setItem(0,1,new QTableWidgetItem("A888"));//第一行第二列的内容
tableWidget->setItem(0,2,new QTableWidgetItem("1234"));//第一行第三列的内容
tableWidget->setItem(0,3,new QTableWidgetItem("888.7"));//第一行第四列的内容
tableWidget->setItem(0,4,new QTableWidgetItem("1299.5"));//第一行第五列的内容
tableWidget->setItem(1,0,new QTableWidgetItem("笨笨"));//第二行第一列的内容
// 40,110,100,60,85
tableWidget->setColumnWidth(0,40); //设置第一列的列宽
tableWidget->setColumnWidth(1,110);//设置第二列的列宽
tableWidget->setColumnWidth(2,100);//设置第三列的列宽
tableWidget->setColumnWidth(3,60); //设置第四列的列宽
tableWidget->setColumnWidth(4,85); //设置第五列的列宽
// 列表的标题----姓名 车牌 工号 金额 累计金额
tableWidget->setHorizontalHeaderLabels(QStringList()
<<QObject::tr("姓名")<<QObject::tr("车牌")<<QObject::tr("工号")<<QObject::tr("金额")<<QObject::tr("累计金额"));
QHBoxLayout *mainlayout = new QHBoxLayout;
mainlayout->addWidget(tableWidget);
QWidget *widget = new QWidget;
widget->setLayout(mainlayout);
widget->setWindowTitle(QObject::tr("QTableWidget Demo"));
widget->show();
return a.exec();
}
|
图7-7-1 创建tableWidget表格
7.7.2 tableWidget相关函数介绍
1. 构造函数
QTableWidget(QWidget *parent = Q_NULLPTR);
QTableWidget(int rows, int columns, QWidget *parent = Q_NULLPTR);
|
参数:
Rows :行数量;Columns :列数量;QWidget *parent :父窗口
构造一个7行5列的表格示例:
//构造一个QTableWidget类的实体对象tableWidget
QTableWidget *tableWidget = new QTableWidget(this);
tableWidget->setRowCount(7);//设置行数为7
tableWidget->setColumnCount(5);//设置列数为5
|
或者
QTableWidget *tableWidget = new QTableWidget(7,5,this);
|
2. 设置行和列的数量
行:
void QTableWidget::setRowCount(int rows) //设置行数量
int QTableWidget::rowCount() const //获取行数量
|
列:
void QTableWidget::setColumnCount(int columns) //设置列数量
int QTableWidget::columnCount() const//获取列数量
|
注意:设置之后,之前的存在多出的行和列将会删除。
3. 清除内容
void clear();
void clearContents();
|
clear() :清除表格内容,包括最顶层的标题。
clearContents():清除表格内容,不清除标题。
4. 插入指定行和列
void insertRow(int row);
void insertColumn(int column);
|
参数:int row:行,int column:列。用于向表格中插入一个空行和空列。
示例:
tableWidget->insertRow(1); //在前第一行下面插入新的一行(横着的称为行)。
tableWidget->insertColumn(1); //在表格基础上插入新的一列(竖着的称为列)
|
5. 设置表格列之间的间距(列宽和行高度)
void setColumnWidth(int column, int width); //设置列宽
int columnWidth(int column) const; //获取列宽
void QTableView::setRowHeight(int row, int height) //设置行高度
int QTableView::rowHeight(int row) const //获取行高度
|
示例:
ui->tableWidget->setColumnWidth(0,50); //第0列宽度为50
ui->tableWidget->setRowHeight(0,50); //第0行宽度为50
|
设置之后效果如下图所示:
6. 自动调整列宽和行高度
void QTableView::resizeRowsToContents() //自动调整所有行高
void QTableView::resizeRowToContents(int row) //自动调整第 row 行行高,将该行条目显示完整
void QTableView::resizeColumnToContents(int column) //自动调整第 column 列列宽,将该列条目显示完整
void QTableView::resizeColumnsToContents() //自动调整所有列宽
|
除了使用以上代码实现自动调整,鼠标双击表头分段的分割线也可以自动调整大小。
7. 给指定行列添加条目
QTableWidgetItem *item(int row, int column) const;
void setItem(int row, int column, QTableWidgetItem *item);
|
setItem :用于给指定行指定列添加显示的内容。
Item :返回指定行和指定列的QTableWidgetItem指针。
表格显示的内容由QTableWidgetItem类描述。可以显示图标,文本等内容!
8. 移除单个单元格
QTableWidgetItem * QTableWidget::takeItem(int row, int column)
|
takeItem不会删除单元格,只是将单元格中的条目卸掉。返回条目的指针。
9. 移除整列和整行
void QTableWidget::removeColumn(int column) //移除一列
void QTableWidget::removeRow(int row)//移除一行
|
removeColumn和removeRow函数只是将指定一行和一列的单元格从表格中移除,不会删除单元格。
10. 获取指定位置的条目指针
表格控件可以根据行号、列号获取条目对象指针,需要判断返回的指针是否为空。
QTableWidgetItem * QTableWidget::item(int row, int column) const
|
也可以通过坐标获取指定的条目:
QTableWidgetItem *itemAt(const QPoint &p) const; //根据x,y坐标获取指定位置的条目
QTableWidgetItem *itemAt(int x, int y) const;
QRect visualItemRect(const QTableWidgetItem *item) const; //获取指定条目的x,y坐标
|
11. 设置当前选中的表格
int currentRow() const; //当前选中行号
int currentColumn() const; //当前选中列号
QTableWidgetItem *currentItem() const;//获取当前选中的条目
void setCurrentItem(QTableWidgetItem *item); //设置指定条目为高亮选中状态。单元格无论是否为空都起作用
void setCurrentCell(int row, int column); //设置指定位置的条目为当前选中条目。
QList<QTableWidgetItem *> QTableWidget::selectedItems() const //获取所有选中的表格
|
12. 自动排序
void setSortingEnabled(booenable); //设置是否启用自动排序
booisSortingEnabled() const; //判断是否支持自动排序
void sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder); //设置排序方式
|
排序方式:升序 Qt::AscendingOrder 、降序 Qt::DescendingOrder。
除了自动排序还可以手动排序:
void QTableWidget::sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder)
|
手动排序时,需要先关闭自动排序。
13. 开启条目可编辑特性
void editItem(QTableWidgetItem *item); //使用单元格进入编辑状态
void openPersistentEditor(QTableWidgetItem *item); //打开编辑器,进入编辑状态
void closePersistentEditor(QTableWidgetItem *item); //关闭编辑器
|
editItem函数使用起来比较简单,激活编辑器后可以自动关闭。openPersistentEditor函数和closePersistentEditor函数需要配对使用。默认情况下表格都支持编辑,鼠标双击即可激活编辑器。
14. 设置表格条目可编辑属性
void setEditTriggers(EditTriggers triggers); //设置可编辑属性
EditTriggers editTriggers() const; //获取可编辑属性
|
因为默认情况下表格都支持编辑,如果只需要只读表格,可以使用setEditTriggers函数进行设置。将属性设置为QAbstractItemView::NoEditTriggers时表格将不支持编辑。
15. 单元格添加Widget控件
QWidget *cellWidget(int row, int column) const; //获取单元格上的Widget控件
void setCellWidget(int row, int column, QWidget *widget); //给指定单元格添加Widget控件
void removeCellWidget(int row, int column); //卸载指定单元格Widget控件
|
注意:单元格添加Widget控件后会覆盖之前显示的内容,如果卸载调用Widget控件,将会显示之前的内容。
16. 单元格内容查找
QList<QTableWidgetItem *> QTableWidget::findItems(const QString & text, Qt::MatchFlags flags) const
|
text 是模板字符串,flags 是匹配标志,匹配标志 Qt::MatchFlags 。可以参考listwidget章节。查找成功后将返回列表。
17. 视图滚动
void QTableWidget::scrollToItem(const QTableWidgetItem * item, QAbstractItemView::ScrollHint hint = EnsureVisible)
|
将条目滚动到可见视野,可以参考前面章节。
18. 合拼单元格
void QTableView::setSpan(int row, int column, int rowSpanCount, int columnSpanCount)
|
第一个参数:要改变的单元格行数
第二个参数:要改变的单元格列数
第三个参数:需要合并的行数
第四个参数:需要合并的列数
示例:
ui->tableWidget->setSpan(1,1,2,2);
|
图7-7-2 合并单元格效果
19. 显示网格线
默认情况下会显示网格线,如果不需要显示可以通过以下函数进行修改。
booshowGrid() const
void setShowGrid(booshow)
|
图7-7-3 网格线显示对比效果
20. 相关的信号
void cellActivated(int row, int column) //单元格被激活
void cellChanged(int row, int column) //单元格内部发生变化,比如:条目内部数据发生变化
void cellClicked(int row, int column) //单元格被点击
void cellDoubleClicked(int row, int column) //单元格被双击
void cellPressed(int row, int column) //单元格被鼠标点击按下
void itemActivated(QTableWidgetItem * item) //条目被激活
void itemChanged(QTableWidgetItem * item) //条目内部数据发生变化,比如:修改文本、修改图标等
void itemClicked(QTableWidgetItem * item) //条目被点击
void itemDoubleClicked(QTableWidgetItem * item) //条目被双击
void itemPressed(QTableWidgetItem * item) //条目被鼠标点击按下
void itemSelectionChanged(); //单元格或者条目被高亮选中。
|
QTableWidget继承于QTableView ,QTableView很多功能都是通过表头QHeaderView 类的函数实现。
1. 获取描述表头指针
QHeaderView * QTableView::horizontalHeader() const //获取整个水平表头
void QTableView::setHorizontalHeader(QHeaderView * header) //设置整个水平表头
QHeaderView * QTableView::verticalHeader() const //获取整个垂直表头
void QTableView::setVerticalHeader(QHeaderView * header) //设置整个垂直表头
|
表格控件本身自带水平表头和垂直表头,正常情况不需要调用setHorizontalHeader() 和setVerticalHeader() 函数,直接获取原本的表头对象指针,进行修改特性即可。
隐藏垂直表头的行号显示示例:
QHeaderView* headerView = tableWidget->verticalHeader();
headerView->setHidden(true); //行号隐藏
|
QHeaderView类提供一个标题行或列标题设置!
2. 显示排序指标
void QHeaderView::setSortIndicatorShown(booshow);
booQHeaderView::isSortIndicatorShown() const;
|
3. 自动拉伸表格最后的单元格
booQHeaderView::stretchLastSection() const
void QHeaderView::setStretchLastSection(boostretch)
|
自动拉伸后效果图如下:
4. 设置表头默认的分段宽度
int QHeaderView::defaultSectionSize() const
void QHeaderView::setDefaultSectionSize(int size)
void QHeaderView::resetDefaultSectionSize()
|
我们可以通过以上设置表头默认分段的函数去设置单元格的默认尺寸。
示例:
ui->tableWidget->horizontalHeader()->setDefaultSectionSize(50); //设置水平分段默认尺寸
ui->tableWidget->verticalHeader()->setDefaultSectionSize(50);//设置垂直分段默认尺寸
|
设置之后的效果图如下:
5. 设置垂直和水平表头标题
void setVerticalHeaderLabels(const QStringList &labels);
void setHorizontalHeaderLabels(const QStringList &labels);
|
示例:
ui->tableWidget->setHorizontalHeaderLabels(QStringList() <<tr("姓名")<<tr("车牌")<<tr("工号")<<tr("金额"));
ui->tableWidget->setVerticalHeaderLabels(QStringList() <<tr("第一行")<<tr("第二行")<<tr("第三行")<<tr("第四行")<<tr("第五行"));
|
如果表头标题需要显示一些丰富的内容,比如图标、工具提示、状态提示等特性时,可以使用QTableWidgetItem条目充当表头标题:
void QTableWidget::setHorizontalHeaderItem(int column, QTableWidgetItem * item) //设置指定列的水平表头QTableWidgetItem * QTableWidget::horizontalHeaderItem(int column) const //获取指定列的水平表头
void QTableWidget::setVerticalHeaderItem(int row, QTableWidgetItem * item) //设置指定行的垂直表头
QTableWidgetItem * QTableWidget::verticalHeaderItem(int row) const //获取指定行的垂直表头
QTableWidgetItem * QTableWidget::takeHorizontalHeaderItem(int column) //卸下指定列的水平表头
QTableWidgetItem * QTableWidget::takeVerticalHeaderItem(int row) //卸下指定行的垂直表头
|
注意:QTableWidgetItem 作为表头条目使用时,本身是只读。无法进行编辑。
6. UI设计师界面也可以直接设置表头的属性
1. 设置选择模式
QAbstractItemView::SelectionMode QHeaderView::selectionMode() const
void QHeaderView::setSelectionMode(QAbstractItemView::SelectionMode mode)
|
选择模式如下:
QAbstractItemView::SingleSelection
|
单选模式。
|
QAbstractItemView::ContiguousSelection
|
连续多选模式。
|
QAbstractItemView::ExtendedSelection
|
扩展多选模式。
|
QAbstractItemView::MultiSelection
|
普通多选模式。
|
QAbstractItemView::NoSelection
|
无选模式。不能选中条目。
|
2. 设置选中行为
tableWidget表格控件从顶层基类 QAbstractItemView 继承了 selectionBehavior 属性,其获取和设置函数如下:
QAbstractItemView::SelectionBehavior selectionBehavior() const
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
|
selectionBehavior 属性枚举如下:
QAbstractItemView::SelectItems
|
鼠标点击时只选中该条目,这个是默认值。
|
QAbstractItemView::SelectRows
|
鼠标点击时选中整行的条目。
|
QAbstractItemView::SelectColumns
|
鼠标点击时选中整列的条目。
|
示例:
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectColumns); //整列选中
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中
|
图7-7-4 tableWidget表格选中行为
7.7.3 QTableWidgetItem相关函数介绍
QTableWidgetItem类给QTableWidget类提供一个单元格条目视图。表格条目用于描述表格显示的信息。条目通常包含文本、图标、复选框等特性。
1. 构造函数
QTableWidgetItem(int type = Type)
QTableWidgetItem(const QString &text, int type = Type) //指定文本
QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type) //可以指定图标和文本
QTableWidgetItem(const QTableWidgetItem &other) //复制其他的QTableWidgetItem
|
2. 获取当前条目所在的行和列
int row() const; //获取行
int column() const; //获取列
|
3. 设置条目选择状态
booQTableWidgetItem::isSelected() const //判断条目自身是否高亮选中
void QTableWidgetItem::setSelected(booselect) //设置条目自身是否被选中
|
4. 设置条目本身的标志
Qt::ItemFlags flags();
void setFlags(Qt::ItemFlags flags);
|
标志的设置枚举可以参考前面章节。比如:listwidget章节。
5. 设置条目的文本和图标
QString text() const //获取文本
void setText(const QString &text); //设置文本
QIcon icon() const //获取图标
void setIcon(const QIcon &icon); //设置图标
|
6. 设置状态栏提示
QString statusTip() const
void setStatusTip(const QString &statusTip);
|
7. 设置条目显示的字体
QFont font() const
void setFont(const QFont &font);
|
8. 设置文本对齐方式
int textAlignment() const
void setTextAlignment(int alignment)
|
9. 设置条目和文本的颜色
QColor background()
void setBackground(const QBrush &brush)//条目的背景画刷。
QBrush foreground()
void setForeground(const QBrush &brush)//条目的前景画刷。
QColor backgroundColor()
void setBackgroundColor(const QColor &color)//文本背景色。
QColor textColor()
void setTextColor(const QColor &color)//文字颜色。
|
10. 设置条目的复选框状态
Qt::CheckState checkState() const //获取复选框状态
void setCheckState(Qt::CheckState state) //设置复选框状态。支持全部选中、未选中、部分选中等状态。
|
11. 数据读写
QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item)
QDataStream &operator>>(QDataStream &in, QTableWidgetItem &item)
|
QTableWidgetItem重载了QDataStream运算符,支持使用QDataStream进行读写数据。
7.7.4 积分卡管理系统示例
积分卡管理系统示例利用表格控件显示个人信息,表格共有姓名、身份证、卡号、电话和开户时间等六列内容,可以对表格按行增加或按行删除个人信息记录。(配套程序编号)
1. widget.ui界面设计内容
图7-7-5 积分卡管理系统UI设计界面
最上面一行是使用的tableWidget控件,显示部分使用标签控件,输入部分使用单行编辑器,最后一行添加了两个按钮,用于开户和注销操作。以上的每一行都是使用水平布局方式,整个Widget窗口采用了垂直布局方式。
表格中编辑的列信息通过UI设计界面添加的,鼠标选中表格控件,右键选择编辑项目选项即可进入到编辑页面。
图7-7-6项目编辑界面
2. widget.cpp文件代码说明
在widget.cpp文件中主要是两个槽函数的代码和构造函数里的初始化代码。
1) 构造函数代码示例
构造函数中主要是做了一些初始化工作。
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("积分卡管理系统");
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中
ui->tableWidget->setShowGrid(true); //显示网格
QHeaderView*headerView=ui->tableWidget->horizontalHeader();//水平表头最后一行自动拉伸
headerView->setStretchLastSection(true); //自动拉伸最后的单元格
// ui->tableWidget->resizeRowsToContents(); //自动调整所有行高
// ui->tableWidget->resizeColumnsToContents(); //自动调整所有列宽
QStringList section_list;
section_list<<"行政部"<<"研发部"<<"人事部";
ui->comboBox_section->addItems(section_list);
}
|
2) 开户按钮槽函数代码
开户功能就是添加功能,获取用户输入的数据,创建QTableWidgetItem,最后添加到表格中去。
//开户功能代码
void Widget::on_pushButton_open_clicked()
{
/*判断用户输入的数据是否合法*/
if(ui->lineEdit_Name->text().isEmpty()||
ui->lineEdit_identityNumber->text().isEmpty()||
ui->lineEdit_phone->text().isEmpty()||
ui->lineEdit_cardnumber->text().isEmpty())
{
QMessageBox::warning(this, tr("错误提示"), tr("姓名、身份证号、电话号码、卡号为必填项!\n"
"请注意检查"),QMessageBox::Ok);
return;
}
/*1. 在表格末尾加入一个新空行,有新的空行才能设置新行条目*/
int nOldRowCount = ui->tableWidget->rowCount();//获取行数量
ui->tableWidget->insertRow(nOldRowCount);//插入新行
/*2. 添加部门单元格*/
QTableWidgetItem *itemsection = new QTableWidgetItem(ui->comboBox_section->currentText());
ui->tableWidget->setItem(nOldRowCount, 0, itemsection);
/*3. 添加姓名单元格*/
QTableWidgetItem *nametion = new QTableWidgetItem(ui->lineEdit_Name->text());
ui->tableWidget->setItem(nOldRowCount, 1, nametion);
/*4. 添加身份证号单元格*/
QTableWidgetItem *identityNumbertion = new QTableWidgetItem(ui->lineEdit_identityNumber->text());
ui->tableWidget->setItem(nOldRowCount, 2, identityNumbertion);
/*4. 添加电话号码单元格*/
QTableWidgetItem *phonetion = new QTableWidgetItem(ui->lineEdit_phone->text());
ui->tableWidget->setItem(nOldRowCount, 3, phonetion);
/*5. 添加卡号单元格*/
QTableWidgetItem *cardnumbertion = new QTableWidgetItem(ui->lineEdit_cardnumber->text());
ui->tableWidget->setItem(nOldRowCount, 4,cardnumbertion);
/*6. 添加开户时间单元格*/
QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
QString str = time.toString("yyyy-MM-dd hh:mm:ss ddd"); //设置显示格式
QTableWidgetItem *timetion = new QTableWidgetItem(str);
ui->tableWidget->setItem(nOldRowCount, 5,timetion);
}
|
3) 注销按钮槽函数代码
注销按钮槽函数代码主要就是将选中的行从表格中移除掉。在移除后还需要删除QTableWidgetItem条目占用的空间。
//注销功能代码
void Widget::on_pushButton_close_clicked()
{
if(ui->tableWidget->rowCount()<=0)
{
QMessageBox::warning(this, tr("错误提示"),tr("没有可注销的信息!"),QMessageBox::Ok);
return;
}
int row=ui->tableWidget->currentRow(); //当前选中行号
//int column=ui->tableWidget->currentColumn(); //当前选中列号
if(row<0)
{
QMessageBox::warning(this, tr("错误提示"),tr("请选择需要删除的信息!"),QMessageBox::Ok);
return;
}
for(int i=0;i<ui->tableWidget->columnCount();i++)
{
//移除单元格
QTableWidgetItem *item=ui->tableWidget->takeItem(row,i);
//删除单元格
delete item;
}
ui->tableWidget->removeRow(row);//移除指定行
}
|
4) 运行效果
图7-7-7 tableWidget运行效果示例
技术合作与咨询
QQ:1126626497
关注我长按二维码可识别微信号:xl1126626497
----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:DS小龙哥 嵌入式技术资讯,建议关注公众号查看原文。如若侵权请联系[email protected]。
----------------------------------------------------------------------------------------------------------------------
|