【问题标题】:QTableView: how to edit non-editable cells in the program?QTableView:如何在程序中编辑不可编辑的单元格?
【发布时间】:2013-09-28 09:29:27
【问题描述】:

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

【问题讨论】:

  • 为什么不继承 QTIM 而不是 QAIM 顺便说一句,当它是关于表的时候?
  • 单元格是否可编辑不应影响您以编程方式设置和显示值的方式。答案可能在于模型 ::setData 和 ::data 方法。我会调试那些。
  • variant.toString() = "AA"; -> 看起来不对,并且错误将出现在模型子类的 setData() 实现中。你能分享那个代码吗?您在那里正确发出数据更改信号吗?

标签: qt qtableview qabstractitemmodel


【解决方案1】:

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

variant.toString() = "AA";

改为:

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

【讨论】:

  • @Lazlo Papp :如果您仔细阅读,您会注意到它在问题中说“setData(..) 操作正在清除单元格中已经写入的数据”。我的逻辑没有缺陷。我承认您首先注意到了故障线路。当我在我的花园里时,我开始想到它。应该承认你是的。我对您的回答投了反对票,因为在这种情况下专注于字符编码非常激进。这是因为在我自己看来,这一切都是我自己意识到的,但我理解你是否认为我偷了你的想法。似乎一直以来我都明白了。
【解决方案2】:

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

代替:

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

你应该写

QVariant variant = QLatin1String("AA");

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 2016-10-31
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2021-05-20
    相关资源
    最近更新 更多