QTableWidget适合在少量的数据的时候使用,或者数据不怎么改变的时候使用。

基本设置

设置行列数据和表头

必需一开始就设置好行/列数据和表头相关信息

1
2
3
ui->tableWidget->setRowCount(10);
ui->tableWidget->setColumnCount(4);
ui->tableWidget->setHorizontalHeaderLabels(lables);

常用的一些设置

不可编辑

1
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

单行选中

1
2
QTreeWidgetItem* root = new QTreeWidgetItem(QStringList() << QStringLiteral("广州模拟规约转换"));
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中模式为选中行

设置单元格为其它控件

1
ui->tableWidget->setCellWidget(row, 0, pBtn);

事件响应

使用右键菜单

按钮点击

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

数据相关

基础数据

设置值

单元格里还没有设置Item时,要先new一个Item出来,相关的值直接在构造函数中传递进去即可。

1
ui->tableWidget->setItem(row, 1, new QTableWidgetItem(QString::number(selectId)));

当单元格已经有值了,只是需要更新数据时,也只需要得到Item,然后setText即可。

1
ui->tableWidget->item(row, 2)->setText("100");

但某个Item需要关联更多的数据的时候,可以使用QtUserRole来保存。

取值

得到想要的数据,首先就是要得到相应的Item指针。然后就很简单了,参考如下:

1
ui->tableWidget->item(0, 2)->text().toInt();

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

附加自定义数据

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

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

如果在Table中插入了很多其他控件,比如第1列有10个QPushButton,再点击按钮时如何识别到底是哪一个按钮点击了?有如下几种思路:

  1. 想办法得到点击的坐标,然后根据坐标查找到QTableWidgetItem,然后就能知道是哪一个按钮点击了。
  2. 在插入button时,给每一个取一个唯一的name,名字部分携带相关信息,然后在点击响应槽中利用元数据信息得到事件源的name,然后得到信息。
    1
    2
    3
    4
    5
    6
    7
    QPushButton *senderObj = qobject_cast<QPushButton*>(sender());
    if(senderObj == nullptr) {
    return;
    }

    QString name = sender()->objectName();
    int row = name.mid(name.indexOf("_") + 1).toInt();
  3. 利用Item的QtUserRole保存额外信息的特性。