如何在Qt中取消设置标志?
How to unset a flag in Qt?
我使用以下代码来禁用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()
是一个不错的选择,您可能会发现它更具可读性。
相关文章:
- 在 CMake 中为每个目标设置编译器/链接器标志
- 如何正确设置 ios 标志以进行流操作?
- 有关使用标志位设置内部错误标志的说明
- 如何在CMakeLists.txt中正确设置CMake标志
- 设置用于调试的 g++ 编译器标志
- 如何在Qt中取消设置标志?
- SDL_CreateWindow在设置标志时失败SDL_WINDOW_VULKAN
- 如何在 cmake 中设置编译器特定的标志
- 如何在图像位中设置标志以标记音频文件的结尾
- 添加 swig pythoncode 以在 Python 对象上设置自己的标志
- 如何在cmake中的源文件之后设置库标志?
- 为什么我必须将错误状态标志设置为 goodbit 才能使其工作
- while 循环是否在设置标志的情况下运行多次?
- 设置 Xcode 标志以便将 python 嵌入我的C++项目中
- 如何嵌入在C++中设置标志的 python 代码
- 检索自最后n秒以来设置标志的次数的有效方法
- 在信号处理程序中设置标志
- 如何在 c++ 中设置标志的格式
- 说双向文件声明不隐式设置标志是否正确
- 如何为 fstream 对象设置标志FILE_FLAG_BACKUP_SEMANTICS