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