如何在Qt中取消标志?

时间:2017-07-31 10:35:44

标签: c++ qt

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

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

这很好用。我不明白如何撤消这个,即如何让细胞再次编辑?

我已尝试再次调用该函数以防切换它。我尝试过调用相同的函数,但在标记前面有~,如其他地方所示。我不确定我是否真的理解Qt中的标志是如何工作的。

2 个答案:

答案 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::ItemIsEnabledQt::ItemIsEditable‌标志位置处保留零,因为除了指定的标志外,它会在任何地方留下零。 setFlags不会向一个引发更多的标志,它只是用指定的标志完全覆盖所有标志。

这不仅仅是Qt中的标志如何工作,而是一般的C ++中按位操作的工作方式。大多数API(包括Qt)只是使用这种行为来实现标志抽象。