Qt QTreeView 详解

本文介绍了如何使用Qt进行界面编程,通过QStandardItemModel和QTreeView实现表格数据的展示,包括设置表头、添加节点、设置节点数据和图标、添加复选框以及设置默认选中项。同时,讲解了响应点击信号的方法,创建右键菜单,并展示了如何设置QSS来改变表格的视觉样式。此外,提供了完整的源码链接供读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.常见接口使用

1.设置表头隐藏,设置表头

QStandardItemModel *model = new QStandardItemModel(this);

//设置表头隐藏
//ui->treeView->setHeaderHidden(true);

//设置表头
model->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");

//设置model 
ui->treeView->setModel(model);

//设置展开
ui->treeView->expandAll();

2.添加节点

这里添加两组数据

    QStandardItem *item1 = new QStandardItem("四年级");

    model->setItem(0,0,item1);
    QStandardItem *item00 = new QStandardItem("张三");
    QStandardItem *item10 = new QStandardItem("张四");
    QStandardItem *item20 = new QStandardItem("张五");

    QStandardItem *item01 = new QStandardItem("男");
    QStandardItem *item11 = new QStandardItem("女");
    QStandardItem *item21 = new QStandardItem("男");

    QStandardItem *item02 = new QStandardItem("15");
    QStandardItem *item12 = new QStandardItem("14");
    QStandardItem *item22 = new QStandardItem("16");

    model->item(0,0)->setChild(0,0,item00);
    model->item(0,0)->setChild(1,0,item10);
    model->item(0,0)->setChild(2,0,item20);

    model->item(0,0)->setChild(0,1,item01);
    model->item(0,0)->setChild(1,1,item11);
    model->item(0,0)->setChild(2,1,item21);

    model->item(0,0)->setChild(0,2,item02);
    model->item(0,0)->setChild(1,2,item12);
    model->item(0,0)->setChild(2,2,item22);


    QStandardItem *item2 = new QStandardItem("五年级");
    model->setItem(1,0,item2);

    QStandardItem *item200 = new QStandardItem("李三");
    QStandardItem *item210 = new QStandardItem("李四");
    QStandardItem *item220 = new QStandardItem("李五");

    QStandardItem *item201 = new QStandardItem("男");
    QStandardItem *item211 = new QStandardItem("女");
    QStandardItem *item221 = new QStandardItem("男");

    QStandardItem *item202 = new QStandardItem("15");
    QStandardItem *item212 = new QStandardItem("14");
    QStandardItem *item222 = new QStandardItem("16");

    model->item(1,0)->setChild(0,0,item200);
    model->item(1,0)->setChild(1,0,item210);
    model->item(1,0)->setChild(2,0,item220);

    model->item(1,0)->setChild(0,1,item201);
    model->item(1,0)->setChild(1,1,item211);
    model->item(1,0)->setChild(2,1,item221);

    model->item(1,0)->setChild(0,2,item202);
    model->item(1,0)->setChild(1,2,item212);
    model->item(1,0)->setChild(2,2,item222);

显示如下

 3.节点可以带数据、图标、flag等

    QStandardItem *item1 = new QStandardItem("四年级");    
    item1->setData("班级");
    item1->setIcon();
    item1->setFlags();

    model->setItem(0,0,item1);

    //访问
    model->item(0,0)->data().toString();
    model->item(0,0)->icon();
    model->item(0,0)->flags();

4.设置节点带checkBox

    model->item(0,0)->setCheckable(true);
    model->item(0,0)->setCheckState(Qt::Checked);

5.设置默认选中第几行

    QModelIndex index = model->item(1,0)->index();
    ui->treeView->setCurrentIndex(index);

二.简单相应一下点击信号

这里简单打印一下节点的名称


//相应这个信号
void clicked(const QModelIndex &index)

void Widget::on_treeView_clicked(const QModelIndex &index)
{
    qDebug()<<model->itemFromIndex(index)->text();
}

三.右键菜单

      //打开右键菜单属性
      ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);

      //右键菜单
      menu = new QMenu(ui->treeView);
      menu->addAction("添加");
      menu->addAction("删除");

      //响应右键菜单信号槽
      connect(ui->treeView,&QTreeView::customContextMenuRequested,
              this,&Widget::slotMenuPopup);

      void Widget::slotMenuPopup(const QPoint &pos)
      {
          menu->exec(ui->treeView->mapToGlobal(pos));
      }

    

四.设置qss

const QString styles = "QTreeView\
{\
    background-color: #5B677A;\
    font-size:17px;\
    color: white;\
}\
QTreeView::item:hover\
{\
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);\
    border: 1px solid #bfcde4;\
}\
QTreeView::item:hover\
{\
    background: rgb(69, 187, 217);\
}\
QTreeView::item:selected:active\
{\
    background: rgb(63, 147, 168);\
}\
QTreeView::item:selected:!active\
{\
    background: rgb(63, 147, 168);\
}\
QTreeView::branch\
{\
    background:#5B677A;\
}\
QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings\
{\
    border-image: none;\
    background:#5B677A;\
    image: url(image/Folder-1.png);\
}\
QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings\
{\
    border-image: none;\
    background:#5B677A;\
    image: url(image/Open-Folder.png);\
}";
调用ui->treeView->setStyleSheet(styles);

五.运行效果

六.源码

https://download.csdn.net/download/wzz953200463/85014146

### 自定义 QTreeView 样式 为了实现更精细的界面设计,可以利用 Qt 的样式表机制来自定义 `QTreeView` 控件。下面提供一段用于修改 `QTreeView` 外观的例子: ```css /* 设置整体边框 */ QTreeView { border: 2px solid darkgray; } /* 修改选中项的颜色 */ QTreeView::item:selected { background-color: lightblue; color: black; } /* 当鼠标悬停在条目上时改变背景色 */ QTreeView::item:hover { background-color: lightgreen; } ``` 上述代码片段展示了如何通过 CSS 定义来调整视图组件的不同部分外观属性[^1]。 对于希望仅影响特定类型的子部件而不波及其他同级或下级部件的情况,可以通过更加具体的选择器达成目的。例如,如果只想更改展开箭头图标,则可采用如下方式: ```css /* 调整分支节点的小三角形样式 */ QTreeView::branch:has-children:!adjoins-item { border-image: url(branch-more.png); } QTreeView::branch:closed:has-children:has-siblings { margin: 4px; border-image: url(branch-closed.png); } QTreeView::branch:open:has-children:!has-siblings { border-image: url(branch-end-open.png); } ``` 这里使用了伪状态选择器来指定不同状态下显示不同的图片资源文件作为装饰图像[^3]。 当应用这些样式到应用程序中的时候,推荐做法是在主窗口或者其他合适的地方调用 `setStyleSheet()` 方法并传入完整的样式字符串。需要注意的是,如果不小心设置了过于宽泛的选择器可能会意外地影响其他不需要变更样式的控件[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬Sunnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值