【问题标题】:QtableView set whole row as readonlyQtableView 将整行设置为只读
【发布时间】:2025-12-15 17:00:02
【问题描述】:

我在将QTableView 的整行设置为只读时遇到问题。当我使用setEnabled 方法时,它只会使第一列只读。这是一个示例,我正在向表中添加一个新行并尝试将整行设为只读:

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

【问题讨论】:

    标签: c++ qt row readonly qtableview


    【解决方案1】:

    每个单元格需要一个项目。

    当你打电话时:

    mp_itemsModel->appendRow(item);
    

    您只为第一列设置了项目。引用 Qt 文档:

    在构建只有一列的列表或树时,此函数 提供了一种方便的方式来追加单个新项目。

    在处理 QTableView 时,您应该调用采用 QList&lt;QStandardItem *&gt;appendRow() 的重载。像这样:

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

    【讨论】:

    • 但是在这一行 QStandardItem* item = new QStandardItem(m_columnLabels.size()); 我创建了一个包含 3 列的项目。如果它已经是一种列表,如何制作它的列表?
    • @ŁukaszPrzeniosło 这不是你在做什么。原型是QStandardItem::QStandardItem(int rows, int columns = 1),因此您正在创建一个具有m_columnLabels.size() 行和1 列的项目。此外,文档说“用子项目的行和列构建一个项目。”所以rowscolumns数字与你的项目需要多少行/列无关,但是您的项目子项将拥有多少行/列。这仅在 QTreeView 中有用。
    • @ŁukaszPrzeniosło 你应该看看文档:doc.qt.io/qt-5/qstandarditemmodel.html#details
    • 我明白了,但我仍然不知道如何为行的每一列设置可编辑标志。如何在这里获取列表,我只有 1 项。可以举个例子吗?