我最近做了一个样本,以便(更)熟悉
QStyledItemDelegate
关于单元格的内联编辑:
在这个示例中,我更新了底层数据模型重载
QStyledItemDelegate::setModelData()
。
阅读完这个问题后,我刚刚测试了如果输入由
电子稳定控制系统
。这就是我观察到的:
-
基础数据保持不变。
-
深入挖掘(即在超载情况下设置断点
setModelData()
),我观察到
setModelData()
在这种情况下甚至不调用。
也许,通过对他的代表进行一点重新设计,就可以很容易地解决OPs问题。
最后,我的派生类(声明)用于实现“全功能”委托以内联编辑表格单元格:
class ValueNameDelegate: public QStyledItemDelegate {
public:
ValueNameDelegate();
virtual ~ValueNameDelegate() = default;
ValueNameDelegate(const ValueNameDelegate&) = delete;
ValueNameDelegate& operator=(const ValueNameDelegate&) = delete;
protected:
virtual QWidget* createEditor(
QWidget *pQParent, const QStyleOptionViewItem &qOption,
const QModelIndex &qMIndex) const override;
virtual void destroyEditor(
QWidget *pQEditor, const QModelIndex &qMIndex) const override;
virtual void setEditorData(
QWidget *pQEditor, const QModelIndex &qMIndex) const override;
virtual void setModelData(
QWidget *pQEditor, QAbstractItemModel *pQModel,
const QModelIndex &qMIndex) const override;
};
注:
在我的例子中,只有一个编辑器小部件是手工创建的。它被重新用于每个单元格编辑(而不是为每个编辑创建一个新的单元格)。
这与
Qt Spin Box Delegate Example
但正如预期的那样。
我无法想象这怎么会对OPs问题没有任何影响。
根据反馈,OP希望处理焦点丢失事件,如输入中止。这与在
QLineEdit
。
因此,我的解决方案是提供
QLineEdit
。而不是改变
QLineEdit
,它只跟踪一个成员
bool _confirmed
是否
进来
已按下。最棘手的部分是确定另一个合适的事件或信号来重置成员。最后,我决定
focusOutEvent()
在正确的时间调用,因此适合此任务。
testQLineEdit-Finished.cc
:
#include <QtWidgets>
class LineEdit: public QLineEdit {
private:
bool _confirmed;
public:
explicit LineEdit(
const QString &contents = QString(), QWidget *pQParent = nullptr):
QLineEdit(contents, pQParent),
_confirmed(false)
{
QObject::connect(this, &QLineEdit::returnPressed,
[this](){ onSigReturnPressed(); });
}
LineEdit(QWidget *pQParent): LineEdit(QString(), pQParent) { }
virtual ~LineEdit() = default;
LineEdit(const LineEdit&) = delete;
LineEdit& operator=(const LineEdit&) = delete;
public:
bool isConfirmed() { return _confirmed; }
protected:
virtual void focusOutEvent(QFocusEvent *pQEvent) override
{
_confirmed = false;
QLineEdit::focusOutEvent(pQEvent);
}
private:
void onSigReturnPressed() { _confirmed = true; }
};
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
LineEdit qEdit(QString::fromUtf8("Hello World"));
qEdit.show();
QObject::connect(&qEdit, &LineEdit::editingFinished,
[&]() {
qDebug() << "Edit confirmed:" << qEdit.isConfirmed();
});
return app.exec();
}
的输出
Edit confirmed: true
通过按
进来
这个
false
单击周围的线条。
这项工作做得相当简单,可能更复杂。然而,它显示了用相当少的代码行实现的原理。