0

这应该如何通过使用 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”。请建议如何将一些数据复制到代码内的不可编辑单元格。

在此处输入图像描述

4

2 回答 2

2

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

variant.toString() = "AA";

改成:

QVariant variant("AA"); // just for testing anyway
于 2013-09-28T09:59:37.823 回答
1

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

代替:

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

你应该写

QVariant variant = QLatin1String("AA");

通常,您会在这种情况下查看 setData(...) 实现是否正确发出数据更改信号等等,但是在这里您输入了一个可能导致问题的先前问题,所以让我们修复它。

注意,您应该使用 QLatin1String 来避免从原始 char* 到 QString 的不必要的显式转换。一般来说,这是一个很好的做法,这在 Qt 4 和 Qt 5 中都可用。

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

于 2013-09-28T10:12:57.947 回答