QT:QtreeView

用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多个按钮代理

移步我的这篇博客,有写好的模板。

QT:QtreeView指定某列的QToolButton多按钮代理-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值