如何在Qt中取消设置标志?

How to unset a flag in Qt?

本文关键字:设置 标志 取消 Qt      更新时间:2023-10-16

我使用以下代码来禁用QTableWidget中单元格的编辑。

ui->tableWidget_1->item(row,col)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);

这工作正常。我不明白如何撤消此操作,即如何使单元格再次可编辑?

我尝试再次调用该函数,以防切换它。我尝试调用相同的函数,但在标志前面有一个~,就像其他地方看到的那样。我不确定我是否真的了解标志在Qt中的工作原理。

项目标志只是整数的位。要设置或取消设置标志,您需要获取该数字:

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‌));

按位 oring 允许您一次设置多个标志。您的示例之所以有效,是因为设置Qt::ItemIsSelectable|Qt::ItemIsEnabled会在Qt::ItemIsEditable‌标志的位置保留零,因为它在除指定标志之外的所有位置都留下零。setFlags不会将更多标志提升到一个,它只是用指定的标志完全覆盖所有标志。

这不仅是标志在Qt中的工作方式,也是按位操作在C++中的工作方式。大多数 API(包括 Qt(只是使用此行为来实现标志抽象。

Sergey的答案通常是人们所做的事情,但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));

哪个更短,但仍然有点冗长,这就是为什么有些人坚持使用按位运算符直接操作标志(这是位掩码(的原因。但是使用setFlag()是一个不错的选择,您可能会发现它更具可读性。