【问题标题】:QListView & QStandardItemModel check text before editing rowQListView & QStandardItemModel 在编辑行之前检查文本
【发布时间】:2013-08-28 01:01:33
【问题描述】:

我想在用户编辑之前检查QListView 中的一行文本。如果它不符合模式,我不想接受它。

目前我有一个QListViewQStandardItemModel。我可以通过QStandardItemModel 轻松添加和删除项目。我还设置了列表视图的模型。

列表或模型中是否有一些delegatesevent 函数可供编辑?

【问题讨论】:

  • 为什么你不能在 setData() 中做到这一点?
  • 您是否为模型重载了 setData() 和 data() 函数?
  • 不,我没有超载它们。

标签: c++ qt events qlistview qstandarditemmodel


【解决方案1】:

您可以从QStandardItemModel 重载data()setData() 函数,然后当用户尝试编辑项目时,您的setData 将被Qt::EditRole 调用,您可以在那里进行处理。

http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#setData

【讨论】:

  • 你知道是否可以覆盖appendRow吗?
  • QStandardItemModel 有 appendRow 函数,它不是虚拟的,参见类参考qt-project.org/doc/qt-5.0/qtgui/qstandarditemmodel.html
  • 你不需要重写它,这就是为什么它被称为 StandardItemModel,它只是以某种方式定义了这个方法并且你同意这个实现 - 这就是你选择 StandardModel 的原因。如果您需要 appendRow 的自定义行为,您应该从 QAbstractItemModel 继承,appendRow 是虚拟的,您可以覆盖它
【解决方案2】:

如果我理解正确,您想在用户尝试进入编辑模式时检查项目的值吗?

使用委托应该可以很好地解决这个问题:

class MyItemDelegate : public QItemDelegate {
    public:
        QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
            if(index.data() == /* do whatever check you want here */) {
                return NULL; // Prevent editing
            }
            return QItemDelegate::createEditor(parent, option, index);
        }
};

listView->setItemDelegate(new MyItemDelegate());

【讨论】:

  • qDebug() << index.data().toString(); 给了我QVariant(QString, "asdfdsaf"),但不是真正的字符串asdfdsaf。如何获取原始数据。
  • QString s = index.data().toString();
猜你喜欢
  • 2020-11-23
  • 2015-07-13
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
相关资源
最近更新 更多