1. 背景
使用QTableWidget时想设置第一列不可编辑,而不是整个QTableWidgetItem不可编辑,遂查找资料,有些心得。
2. 设置方法
给该列的每一个Item设置Flags,其实只要不是Qt::ItemIsSelectable,应该都可以做到不可编辑状态(没有一 一尝试)。
QTableWidgetItem *item0 = new QTableWidgetItem(QString::number(timeInterval));item0->setFlags(Qt::ItemIsEnabled);//此处是关键ui.tableWidget->setItem(row, 0, item0);
3. 进一步了解
在Qt Assitant中查看Qt::ItemFlags,结果如下:
enum Qt::ItemFlag
flags Qt::ItemFlags
This enum describes the properties of an item:
这是枚举类型,列出了很多值。再用qDebug()分别输出一下设置后的Flags和默认的Flags。
QTableWidgetItem *item1 = new QTableWidgetItem(QString::number(speedValue));qDebug()<< item0->flags();qDebug()<< item1->flags();
结果如下,默认的flags居然有6个。
QFlags<Qt::ItemFlag>(ItemIsEnabled)QFlags<Qt::ItemFlag>(ItemIsSelectable|ItemIsEditable|ItemIsDragEnabled|ItemIsDropEnabled|ItemIsUserCheckable|ItemIsEnabled)
不难发现,默认的设置如果转成二进制值为000111111(十进制63),而我们设置的为0 0010 0000(在表中不能被选中,那也肯定不能被用户编辑了)。所以下面两行代码等价:
item0->setFlags(Qt::ItemIsEnabled);item0->setFlags((Qt::ItemFlag)32);//使用数字描述flags
比如默认的设置是多个组合,我们就可以用63代替。写代码时可以根据选择,灵活使用数字,减少代码书写。
查看Qt助手时,还发现了
Note that checkable items need to be given both a suitable set of flags and an initial state, indicating whether the item is checked or not. This is handled automatically for model/view components, but needs to be explicitly set for instances of QListWidgetItem, QTableWidgetItem, and QTreeWidgetItem
.
说是QTableWidgetItem需要显式设置,应该是建议我们根据需要自己设置。