我使用以下代码禁用QTableWidget
中的单元格编辑。
ui->tableWidget_1->item(row,col)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
这很好用。我不明白如何撤消这个,即如何让细胞再次编辑?
我已尝试再次调用该函数以防切换它。我尝试过调用相同的函数,但在标记前面有~
,如其他地方所示。我不确定我是否真的理解Qt中的标志是如何工作的。
答案 0 :(得分:5)
谢尔盖的答案通常是人们所做的,但也有Qt的替代方案。
Qt在QFlags
类模板中包装枚举标志。对于Qt定义的枚举,这会自动发生。
您可以使用setFlag()
功能设置和取消设置单个标志:
auto item = item(row, col);
auto flags = item->flags();
flags.setFlag(Qt::ItemIsEnabled, false).setFlag(Qt::ItemIsSelectable, false);
item->setFlags(flags);
setFlag()
可以链接(如示例中所示),因为它返回对flags对象的引用。所以你可以这样写:
item->setFlags(item->flags()
.setFlag(Qt::ItemIsEnabled, false)
.setFlag(Qt::ItemIsSelectable, false));
哪个更短,但仍然有点冗长,这就是为什么有些人坚持使用逐位操作符来直接操作标志(bit masks)。但是使用setFlag()
是一个很好的选择,您可能会发现它更具可读性。
答案 1 :(得分:4)
Item flags只是整数的位。要设置或取消设置标志,您需要获取该数字:
auto currentFlags = ui->tableWidget_1->item(row,col)->flags();
并分别将一个或零写入所需位置,保持其他位不变。例如,要启用编辑,您可以执行以下操作:
auto currentFlags = ui->tableWidget_1->item(row,col)->flags();
ui->tableWidget_1->item(row,col)->setFlags(currentFlags | Qt::ItemIsEditable);
类似地,此代码禁用编辑:
auto currentFlags = ui->tableWidget_1->item(row,col)->flags();
ui->tableWidget_1->item(row,col)->setFlags(currentFlags & (~Qt::ItemIsEditable));
Bitwise oring允许您一次设置多个标志。您的示例有效,因为设置Qt::ItemIsSelectable|Qt::ItemIsEnabled
在Qt::ItemIsEditable
标志位置处保留零,因为除了指定的标志外,它会在任何地方留下零。 setFlags
不会向一个引发更多的标志,它只是用指定的标志完全覆盖所有标志。
这不仅仅是Qt中的标志如何工作,而是一般的C ++中按位操作的工作方式。大多数API(包括Qt)只是使用这种行为来实现标志抽象。