2017-02-05 87 views
0

我在設置QTableView的整行爲只讀時出現問題。當我使用setEnabled方法時,它只使第一列只讀。下面是一個例子,我加入一個新行到表,並試圖使整個排只讀:QtableView將整行設置爲只讀

void CItemsMenu::addSlave(const quint8 addr, const QString& uniqId, const QString& userString) 
{ 
    // create new item 
    QStandardItem* item = new QStandardItem(m_columnLabels.size()); // size is 3 

    // make item readonly 
    item->setEditable(false); // this makes only the 1st column readonly 

    // append new item 
    mp_itemsModel->appendRow(item); 
    int row = mp_itemsModel->rowCount() - 1; 

    // slave address 
    mp_itemsModel->setData(mp_itemsModel->index(
           row, (int)itemsTableCol::slaveAddr, QModelIndex()), addr, Qt::EditRole); 

    // unique ID 
    mp_itemsModel->setData(mp_itemsModel->index(
           row, (int)itemsTableCol::uniqId, QModelIndex()), uniqId, Qt::EditRole); 

    // user string 
    mp_itemsModel->setData(mp_itemsModel->index(
           row, (int)itemsTableCol::userStr, QModelIndex()), userString, Qt::EditRole); 
} 

我很感激所有幫助。

編輯:解:

QList<QStandardItem*> itemsList; 
for (int i = 0; i < m_columnLabels.size(); i++) 
{ 
    itemsList.append(new QStandardItem(1)); 
    itemsList.last()->setEditable(false); 
} 

回答

1

你需要每單元一個項目。

當你撥打:

mp_itemsModel->appendRow(item); 

你只設置項目的第一列。引用Qt文檔:

當建立一個列表,或者只有一列一棵樹,這個功能 提供了一個方便的方式來添加一個新項目。

當你要調用的appendRow(),需要一個QList<QStandardItem *>超載一個QTableView中處理。就像這樣:

QList<QStandardItem *> list; 
... // Fill list and set all items in the list to be read-only. 
mp_itemsModel->appendRow(list); 
+0

但在這一行'QStandardItem *項目=新QStandardItem(m_columnLabels.size());'我創建3列的項目。如果它已經是一種列表,如何製作它的列表? – Bremen

+0

@ŁukaszPrzeniosło這不是你在做什麼。原型是'QStandardItem :: QStandardItem(int rows,int columns = 1)',所以你正在用'm_columnLabels.size()'行和1列創建一個項目。此外,文檔中還提到「_構建一個包含子項的行和列列的項目。」因此,「行」和「列」編號與您的項目需要多少行/列無關,但有多少行/列你的項目的孩子將有。這隻在QTreeView中有用。 –

+0

@ŁukaszPrzeniosło你應該看看文檔:http://doc.qt.io/qt-5/qstandarditemmodel.html#details –