2017-02-05 47 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 –