用QtreeView显示表格
这里使用QStandItemModel来填充QtreeView
一、表头
可以使用QStandItemModel的setHorizontalHeaderLabels()函数,传入QStringList作为参数,作为QtreeView显示的表头。
例如:
_treeViewModel->setHorizontalHeaderLabels(QStringList()<<tr("Name")<<tr("BirthTime")<<tr("LastEditTime")<<tr("Size"));
二、内容
这里分为两类讨论。一类是顶层,一类为非顶层。
顶层:直接调用_treeViewModel的setItem(),输入行、列和需要加入的item。
非顶层:先找到对应的顶层,对找到的顶层调用setChild(),输入行、列、需要加入的item。
三、格式
只能选中行:
ui->treeView->setSelectionBehavior(QAbstractItemView::SelectRows); //单击选择行
ui->treeView->setSelectionMode(QAbstractItemView::SingleSelection); //设置只能选择一行
最后一列自动填充剩下的宽度:
##如果想要手动调整宽度,可以手动设置宽度,然后最后一列自动填充剩下的宽度
ui->treeView->header()->setStretchLastSection(true); //最后一行填充剩下的宽度
ui->treeView->setColumnWidth(0,300);
ui->treeView->setColumnWidth(1,250);
ui->treeView->setColumnWidth(2,250);
##这里还有另外一个注意点,在构造函数里,ui里的控件都是没有宽度的(还没有生成)!!!所以setColumnWidth()不要写在构造函数里!
表头各个列能够平均分布:
ui->treeView->header()->setSectionResizeMode(QHeaderView::Stretch);
##但是,注意,使用QHeaderView::Stretch后,列表头无法再手动调整宽度
取消表头各个列之间的分割线:
ui->treeView->header()->setStyleSheet("QHeaderView::section{border:0px;}");
获取文件信息:
#filePath文件的完整路径
QFileInfo fileInfo(filePath);
QString fileName = fileInfo.fileName();//文件的名称
QString fileSize = fileInfo.size();//文件的大小,单位是比特
QDateTime BirthTime = fileInfo.birthTime();//文件创建时间
QDateTime EditTime= fileInfo.lastModified();//文件最近修改时间
bool isdir = fileInfo.isDir();//判断是不是文件夹
bool isfile = fileInfo.isFile();//判断是不是文件
允许右键显示菜单:
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);//可以使用右键菜单
鼠标放在对应行时有提示文本:
QStandardItem* newItem = new QStandardItem(fileName);
newItem->setToolTip(fileName);//提示文本
_treeViewModel->setItem(row,0,newItem);
根据想要的格式显示时间:
QStandardItem* BirthTime = new QStandardItem(fileInfo.birthTime().toString("yyyy/MM/dd hh:mm"));
将文件大小由qint64转为KB、MB、GB
QString changeUnit(const qint64 &size)
{
double result = 0.0; //结果
QString unit ="B";
qint64 standardSize = size;
if(standardSize > 1024) {
result = standardSize /1024.0;
standardSize /= 1024;
unit = "KB";
if(standardSize > 1024) {
result = standardSize /1024.0;
standardSize /= 1024;
unit = "MB";
if(standardSize > 1024) {
result = standardSize /1024.0;
standardSize /= 1024;
unit = "GB";
}
}
}
return QString::number(result,'f',3)+unit;//结果保留3位小数
}
指定列不可编辑
法一:
在创建QStandItem的时候直接设置指定item不可编辑
if(xxx == "xxx"){//不可编辑的条件
item->setFlags(item->flags() & (~Qt::ItemIsEditable));//不可编辑
}
法二:
# 设置QTableWidget可编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::CurrentChanged);
# 遍历表格的每一行
for(int i=0; i<ui->tableWidget->columnCount()-1; i++)
{
QTableWidgetItem* item = ui->tableWidget->item(i,1); //获取每行第1列的单元格指针
item->setFlags(Qt::ItemIsEnabled);//设置改item不可修改;
}
指定列可编辑
在为`QTreeView`设置的模型类中重写`flags`方法以指定哪些列可编辑。假设你的模型类名为`TreeViewModel`,你可以这样:
```cpp
Qt::ItemFlags TreeViewModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::ItemIsFlags;
// Set the fourth column as editable
if (index.column() == 3) { //因为index是从0开始的,所以第四列的index是3
return Qt::ItemIsEditable | QAbstractItemModel::flags(index);
}
return QAbstractItemModel::flags(index);
}
```
然后,在设置tree view的模型时,确保你使用的是这个模型类:
```cpp
QTreeView *view = new QTreeView;
TreeViewModel *model = new TreeViewModel;
view->setModel(model); // 使用定制的模型类
```
四、对指定列进行ToolButton多个按钮代理
移步我的这篇博客,有写好的模板。