QItemDelegate,如何在closeEditor()信号中提供我自己的EndEditHint
QItemDelegate, how to provide my own EndEditHint in closeEditor() signal?
我有自己的表模型从QAbstractTableModel
子类化。它安装在我的视图上(从QTableView
子类化(。在视图中,我正在使用委托类(从QItemDelegate
子类化(来编辑项目。
我想设置以下行为:当我使用委托完成数据编辑时,模型中的下一项(下一行和同一列中的项(应该可编辑。
文档说它是由QAbstractItemDelegate::EditNextItem
信号中发送closeEditor()
提示提供的。但默认情况下,此信号使用QAbstractItemDelegate::NoHint
参数发送。问题是,在重新实现基本QItemDelegate
虚函数(例如setModelData()
(时,我不必显式调用此信号。
文档还说,此信号由内部事件筛选器发送,该筛选器在调用构造函数时安装在项目委托上QAbstractItemDelegate()
。
如何在closeEditor()
信号中提供自己的EndEditHint
?
完成编辑后,委托会发送带有SubmitModelCache
提示的closeEditor()
信号。您必须保留此行为才能正确更新模型。
要在提交上次编辑的数据后立即在下一个单元格中打开编辑器,您可以重新实现QItemDelegate::eventFilter()
但我发现重新实现QAbstractItemView::closeEditor()
方法要容易得多:
void CMyTableView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint)
{
QTableView::closeEditor(editor, hint);
QModelIndex index = moveCursor(MoveNext, Qt::NoModifier);
if (!index.isValid())
return;
QPersistentModelIndex persistent(index);
selectionModel()->setCurrentIndex(persistent, flags);
// currentChanged signal would have already started editing
if (index.flags() & Qt::ItemIsEditable && (!(editTriggers() & QAbstractItemView::CurrentChanged)))
edit(persistent);
}
更简单的解决方案是(我不确定,但绝对值得一试(:
void CMyTableView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint)
{
QTableView::closeEditor(editor, hint);
QTableView::closeEditor(nullptr, QAbstractItemDelegate::EditNextItem);
}
moveCursor()
方法返回下一列和同一行的索引。如果要更改此行为,请重新实现它:
QModelIndex CMyTableView::moveCursor(CursorAction action, Qt::KeyboardModifiers modifiers)
{
if (action == QAbstractItemView::MoveNext)
action = QAbstractItemView::MoveDown;
else if (action == QAbstractItemView::MovePrevious)
action = QAbstractItemView::MoveUp;
// Next row, same column.
return QTableView::moveCursor(action, modifiers);
}
顺便说一下:当您按 Tab 键时,默认QTableView
行为是关闭当前编辑器、保存数据并编辑下一个单元格。
因此,也许您唯一需要做的就是重新实现QTableView::moveCursor()
方法。
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 将矩阵乘以我自己的输入的向量
- 如何正确包含我自己的标头?
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 预期'while'或预期'}' 之前回答是,但我自己无法修复
- 为什么__builtin_popcount比我自己的比特计数功能慢?
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 如何在我自己的staticLib中使用staticLib
- 在我自己的堆栈中实现top的问题
- 尝试检查输入的文本与我自己的自定义答案
- 如何在我自己的类中重载"+"和"<<"运算符
- C++:我自己类的动态数组
- 如何在 C++ 中使用我自己的类中的库?
- 如何链接我自己的 .so 文件而不是操作系统捆绑包 .so 文件?
- 如何构建默认使用我自己的构建libc ++的clang?
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 分发我自己的程序的几个问题
- 尝试编写我自己的字符串类在 gcc 中出现异常
- Qt - 重新实现QIODevice,实时听到我自己的声音
- QItemDelegate,如何在closeEditor()信号中提供我自己的EndEditHint