记录我使用过的一些特性

基本设置

设置列数和列的表头

1
2
ui->treeWidget->setColumnCount(1);
ui->treeWidget->setHeaderLabel(""); // 多个列的话用QStringList

设置顶层元素

顶层元素可以多个

1
2
QTreeWidgetItem* root = new QTreeWidgetItem(QStringList() << QStringLiteral("广州模拟规约转换"));
ui->treeWidget->addTopLevelItem(root); // 多个元素的话,放到QList中,然后一次性添加进去

插入节点

表示节点的类是QTreeWidgetItem,使用QStringList可以同时设置多列的值。在new 出来Item后,还需要添加到某个节点下作为其子节点

事件响应

使用右键菜单

首先要使能右键弹出菜单功能

1
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

然后利用customContextMenuRequested信号,创建相应的槽函数来响应右键。在响应代码中创建Menu,然后弹出Menu即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
QTreeWidgetItem * it = ui->treeWidget->itemAt(pos);
if(!it)
return;

TreeItemLevel level = static_cast<TreeItemLevel>(it->data(0, Qt::UserRole).toInt());
if(level == LevelChannel)
{
QMenu menu(ui->treeWidget);
menu.addAction(_pChannelNewDevice);
menu.exec(QCursor::pos());
}
else if(LevelDevice == level)
{
QMenu menu(ui->treeWidget);
menu.addAction(_pDeviceCopy);
menu.addAction(_pDeviceDelete);
menu.exec(QCursor::pos());
}
}

按钮点击

这个不难,查找文档找到点击信号,然后建立起相应的连接即可。信号参数中已经指明了点击的Item和colum。

数据相关

基础数据

得到想要的数据,首先就是要得到相应的Item指针。左键点击得到对应的Item比较容易,右键点击要想知道当前点击的Item要较为麻烦点。使用如下的方法可行:

1
QTreeWidgetItem * it = ui->treeWidget->itemAt(pos);

最基础的相关数据包括,父节点,在父节点中的序号(第几个字节节点),节点文字的类型,节点的类型等等。很多时候,有这些数据就行了。

附加自定义数据

当我们需要在TreeItem上关联较为复杂的数据时,可以利用QtUserRole域来保存QVarient数据的特性,如下是保存和取数据的代码:

1
2
3
device->setData(0, Qt::UserRole + 1, QVariant::fromValue(data));
QVariant var = item->data(0, Qt::UserRole + 1);
TreeDeviceNodeAttachData deviceData = var.value<TreeDeviceNodeAttachData>();