2017-07-31 217 views
2

我正在使用以下代码来禁用编辑QTableWidget中的单元格。如何在Qt中取消设置标志?

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

这工作正常。我不明白如何解除这个问题,即如何让细胞再次编辑?

我试过再次调用函数来切换它。我试过调用相同的函数,但在其他地方看到旗子前面有~。我不确定我是否真的了解Qt中的标志是如何工作的。

+1

请看看Qt文档。 ['Qt的:: ItemFlag'](http://doc.qt.io/qt-5/qt.html#ItemFlag-enum)。要使项目可编辑,您必须执行:'ui-> tableWidget_1-> item(row,col) - > setFlags(Qt :: ItemIsSelectable | Qt :: ItemIsEnabled | Qt :: ItemIsEditable);' – Scheff

+1

如果您将'〜 (Qt :: ItemIsSelectable | Qt :: ItemIsEnabled)',你可以设置任何标志,除了两个 - 因此该项目不再启用(也不可选)。这可能不是你想要的。 – Scheff

回答

2

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

按位或运算允许您一次设置多个标志。您的示例工作原因是设置Qt::ItemIsSelectable|Qt::ItemIsEnabledQt::ItemIsEditable‌标志的位置留下了零,因为除了指定的标志外,它在任何地方都会留下零。 setFlags不会引发更多标志到一个标志,它只是完全覆盖指定标志的所有标志。

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

3

谢尔盖的答案通常是人们所做的,但Qt也有其他选择。

Qt在QFlags类模板中包含枚举标志。这会自动发生在由Qt定义的枚举上。因为它返回一个参考标志对象

auto item = item(row, col); 
auto flags = item->flags(); 
flags.setFlag(Qt::ItemIsEnabled, false).setFlag(Qt::ItemIsSelectable, false); 
item->setFlags(flags); 

setFlag()可以链接(如在该示例中可以看出):

可以使用setFlag()函数来设置和取消个人标志。所以,你可以写类似:

item->setFlags(item->flags() 
    .setFlag(Qt::ItemIsEnabled, false) 
    .setFlag(Qt::ItemIsSelectable, false)); 

这是短,但还是有点冗长,这就是为什么有些人坚持位运算符来操纵标志直接(这是bit masks)。但使用setFlag()是一个很好的选择,你可能会发现更多的可读性。

相关问题