2017-07-31 221 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()是一個很好的選擇,你可能會發現更多的可讀性。

相關問題