如何在Qt中取消标志?

t02*_*608 6 c++ qt

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

ui->tableWidget_1->item(row,col)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
Run Code Online (Sandbox Code Playgroud)

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

我试过再次调用该函数以防切换它.我试过调用相同的功能,但~在其他地方看到的标志前面.我不确定我是否真的理解Qt中的标志是如何工作的.

Nik*_* C. 8

谢尔盖的答案通常是人们所做的,但也有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);
Run Code Online (Sandbox Code Playgroud)

setFlag()可以链接(如示例中所示),因为它返回对flags对象的引用.所以你可以这样写:

item->setFlags(item->flags()
    .setFlag(Qt::ItemIsEnabled, false)
    .setFlag(Qt::ItemIsSelectable, false));
Run Code Online (Sandbox Code Playgroud)

哪个更短,但仍然有点冗长,这就是为什么有些人坚持使用逐位操作符来直接操作标志(这是位掩码).但是使用setFlag()是一个很好的选择,你可能会发现它更具可读性.


Ser*_*gey 7

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

auto currentFlags = ui->tableWidget_1->item(row,col)->flags();
Run Code Online (Sandbox Code Playgroud)

并将一个或零分别写入所需的位置,而其他位保持不变。例如,要启用编辑,您可以执行以下操作:

auto currentFlags = ui->tableWidget_1->item(row,col)->flags();
ui->tableWidget_1->item(row,col)->setFlags(currentFlags | Qt::ItemIsEditable?);
Run Code Online (Sandbox Code Playgroud)

类似地,此代码禁用编辑:

auto currentFlags = ui->tableWidget_1->item(row,col)->flags();
ui->tableWidget_1->item(row,col)->setFlags(currentFlags & (~Qt::ItemIsEditable?));
Run Code Online (Sandbox Code Playgroud)

按位运算允许您一次设置多个标志。您的示例之所以有效,是因为设置Qt::ItemIsSelectable|Qt::ItemIsEnabledQt::ItemIsEditable?标志的位置保留了零,因为除指定标志之外的所有地方都保留了零。setFlags不会将更多标志置为1,而只是完全覆盖具有指定标志的所有标志。

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