QTableView:如何在程序中编辑不可编辑的单元格?

时间:2013-09-28 09:29:28

标签: qt qtableview qabstractitemmodel

如何使用model-> setData()方法调用?

我从QStandardItemModel派生了一个名为“MyStandardItemModel”的类。我通过覆盖受保护的虚拟标志方法使我的第三和第四列不可编辑。这是怎么回事:

#define TX_PACKET_COLUMN (4u)
#define RX_PACKET_COLUMN (5u)

Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex& index) const
{
    if (index.column() == TX_PACKET_COLUMN || index.column() == RX_PACKET_COLUMN)
    {
        return (QStandardItemModel::flags(index) & ~Qt::ItemIsEditable);
    }
    else
    {
        return QStandardItemModel::flags(index);
    }
}

...

//Set model
ui->testCaseTableView->setModel(model);

完成此操作后,我无法编辑第三和第四列中的单元格。

现在,我希望当我双击这些单元格时,会出现一个弹出对话框。我将在该对话框的可编辑字段中修改一些数据,然后将其复制回代码中不可编辑的单元格。

我试图为QTreeView编写一个doubleclick()处理程序,只是将一些数据复制到单元格中,以查看是否可以将数据复制到不可编辑的单元格。

此操作失败,数据未写入不可编辑的单元格。

在这里你可以找到双击处理程序:

void MainWindow::on_testCaseTableView_doubleClicked(const QModelIndex &index)
{
    QVariant variant;
    variant.toString() = "AA";

    if((index.column() == TX_PACKET_COLUMN)||(index.column() == RX_PACKET_COLUMN))
    {
        model->setData(index, variant);   // set new value
    }

}

setData(..)操作正在清除单元格中已写入的数据,但字符串“AA”未写入。请建议如何将一些数据复制到代码中的不可编辑单元格。

enter image description here

2 个答案:

答案 0 :(得分:2)

QVariant设置为空。您的模型中没有任何错误。错误在这一行:

variant.toString() = "AA";

更改为:

QVariant variant("AA"); // just for testing anyway

答案 1 :(得分:0)

正如我在评论中指出的那样,你必须解决第一个问题:

而不是:

QVariant variant;
variant.toString() = "AA";

你应该写

QVariant variant = QLatin1String("AA");

一般情况下,无论是否正确发出数据更改信号等,您都会查看setData(...)实现,但是在这里您输入的先前问题会导致问题,所以让我们解决这个问题。

注意,您应该使用QLatin1String来避免从raw char *到QString的不必要的显式转换。这是一个很好的做法,Qt 4以及Qt 5都可以使用。

虽然,您也可以使用QStringLiteral宏来非常有效地使用原始文字中的模板魔术创建QString,但这需要C ++ 11。