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

QTableView:如何在程序中编辑不可编辑的单元格?,qt,qtableview,qabstractitemmodel,Qt,Qtableview,Qabstractitemmodel,如何使用model->setData()方法调用来实现这一点 我从QStandardItemModel派生了一个名为“MyStandardItemModel”的类。通过重写protectedvirtualflags方法,我已使第三列和第四列不可编辑。事情是这样的: #define TX_PACKET_COLUMN (4u) #define RX_PACKET_COLUMN (5u) Qt::ItemFlags MyStandardItemModel::flags(const QModelInd

如何使用model->setData()方法调用来实现这一点

我从QStandardItemModel派生了一个名为“MyStandardItemModel”的类。通过重写protectedvirtualflags方法,我已使第三列和第四列不可编辑。事情是这样的:

#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”。请建议如何将一些数据复制到代码中不可编辑的单元格


QVariant集为空。您的模型中不需要有任何错误。错误在这一行:

variant.toString() = "AA";
改为:

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

QVariant集合为空。您的模型中不需要有任何错误。错误在这一行:

variant.toString() = "AA";
改为:

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

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

而不是:

QVariant variant;
variant.toString() = "AA";
你应该写

QVariant variant = QLatin1String("AA");
一般来说,您会研究setData(…)实现在这种情况下是否正确地发出数据更改信号等等,但是这里您输入了一个可能导致问题的先前问题,所以让我们来解决这个问题

注意,应该使用QLatin1String来避免从原始字符*到QString的不必要的显式转换。这通常是一个很好的实践,Qt4和Qt5都提供了这一点


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

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

而不是:

QVariant variant;
variant.toString() = "AA";
你应该写

QVariant variant = QLatin1String("AA");
一般来说,您会研究setData(…)实现在这种情况下是否正确地发出数据更改信号等等,但是这里您输入了一个可能导致问题的先前问题,所以让我们来解决这个问题

注意,应该使用QLatin1String来避免从原始字符*到QString的不必要的显式转换。这通常是一个很好的实践,Qt4和Qt5都提供了这一点


尽管如此,您也可以使用QStringLiteral宏使用原始文本的模板魔术非常高效地创建QString,但这需要C++11。

当涉及表时,为什么不继承QTIM而不是QAIM?单元格是否可编辑不应影响以编程方式设置和显示值的方式。答案可能在于models::setData和::data方法。我会调试那些.variant.toString()=“AA”;->看起来是错误的,错误将出现在模型子类的setData()实现中。你能分享那个代码吗?您是否正确地发出了数据更改信号?当涉及表格时,为什么不继承QTIM而不是QAIM顺便说一句?单元格是否可编辑不应影响您通过编程设置和显示值的方式。答案可能在于models::setData和::data方法。我会调试那些.variant.toString()=“AA”;->看起来是错误的,错误将出现在模型子类的setData()实现中。你能分享那个代码吗?你是否正确地发出了数据更改信号?@Lazlo Papp:如果你仔细阅读,你会注意到问题中提到“setData(..)操作正在清除单元格中已写入的数据”。我的逻辑没有缺陷。我承认您首先注意到了故障线路。当我在花园里的时候,我想起了它。应该承认你是的。我对你的答案投了反对票,因为在这种情况下,把重点放在字符编码上是非常困难的。这是因为在我看来,这一切都是我自己意识到的,但我理解如果你认为我偷了你的想法。拉兹洛·帕普:如果你仔细阅读,你会注意到问题中说“setData(..)操作正在清除单元格中已经写入的数据”。我的逻辑没有缺陷。我承认您首先注意到了故障线路。当我在花园里的时候,我想起了它。应该承认你是的。我对你的答案投了反对票,因为在这种情况下,把重点放在字符编码上是非常困难的。这是因为在我看来,这一切都是我自己意识到的,但我理解如果你认为我偷了你的想法。但似乎我一直都明白这一点。