我正在使用以下代碼來禁用編輯QTableWidget
中的單元格。如何在Qt中取消設置標誌?
ui->tableWidget_1->item(row,col)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
這工作正常。我不明白如何解除這個問題,即如何讓細胞再次編輯?
我試過再次調用函數來切換它。我試過調用相同的函數,但在其他地方看到旗子前面有~
。我不確定我是否真的瞭解Qt中的標誌是如何工作的。
我正在使用以下代碼來禁用編輯QTableWidget
中的單元格。如何在Qt中取消設置標誌?
ui->tableWidget_1->item(row,col)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
這工作正常。我不明白如何解除這個問題,即如何讓細胞再次編輯?
我試過再次調用函數來切換它。我試過調用相同的函數,但在其他地方看到旗子前面有~
。我不確定我是否真的瞭解Qt中的標誌是如何工作的。
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::ItemIsEnabled
在Qt::ItemIsEditable
標誌的位置留下了零,因爲除了指定的標誌外,它在任何地方都會留下零。 setFlags
不會引發更多標誌到一個標誌,它只是完全覆蓋指定標誌的所有標誌。
這不僅是標誌如何在Qt中工作,它是一般的C++中按位操作的工作原理。大多數API(包括Qt)只是使用這種行爲來實現標誌抽象。
謝爾蓋的答案通常是人們所做的,但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()
是一個很好的選擇,你可能會發現更多的可讀性。
請看看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
如果您將'〜 (Qt :: ItemIsSelectable | Qt :: ItemIsEnabled)',你可以設置任何標誌,除了兩個 - 因此該項目不再啓用(也不可選)。這可能不是你想要的。 – Scheff