Qt 为“QModelIndex”获取“QWidget*编辑器”时遇到问题`
我在扩展的默认编辑行为时遇到问题。按下Enter键时,我需要以下行为:Qt 为“QModelIndex”获取“QWidget*编辑器”时遇到问题`,qt,qt4,qtableview,model-view,Qt,Qt4,Qtableview,Model View,我在扩展的默认编辑行为时遇到问题。按下Enter键时,我需要以下行为: 如果当前单元格尚未编辑,则开始编辑该单元格 如果正在编辑单元格, 2a。提交数据并关闭编辑器。那么 2b。使下面的单元格(如果存在)成为当前单元格 2a是默认行为,2b可能通过在的重新实现中使用实现(如类似上下文中所建议的) 问题在于实现1。我在下面列出了我迄今为止尝试过的方法 重新配置“平台编辑键”默认情况下,“当在项目上按下平台编辑键时,编辑开始。”()此键在我的平台上为F2(Ubuntu 12.04)。我可以将平
- 2a。提交数据并关闭编辑器。那么
- 2b。使下面的单元格(如果存在)成为当前单元格
- 重新配置“平台编辑键”默认情况下,“当在项目上按下平台编辑键时,编辑开始。”()此键在我的平台上为F2(Ubuntu 12.04)。我可以将平台编辑键重新配置为输入,但
- 改变平台默认值似乎是个坏主意
- 我不知道怎么做
- 捕获回车键,我使用以下方法执行此操作:
这确实捕获了回车键并完成了1(从上面),但现在2被破坏。因此,我需要查看上面class CourseTable : public QTableView { /* ... */ }; /* ... */ CourseTable::CourseTable(/* ... */) { /* ... */ QShortcut* shortcut = new QShortcut(QKeySequence(Qt::Key_Return), this); connect(shortcut, SIGNAL(activated()), this, SLOT(handleEnter_())); /* ... */ } /* ... */ void CourseTable::handleEnter_() { QModelIndex idx = this->currentIndex(); if (this->state() != QAbstractItemView::EditingState) this->edit(idx); /* else // see below */ }
中的CourseTable::handleEnter()
子句,可能需要调用并包含在其中。问题是,这两个函数都需要一个else
参数,我就是不知道如何获取该参数。我可以子类化,向派生类添加一个QWidget*编辑器
方法,并修改现有代码以将派生委托类的实例传递给getEditor()
函数。但这听起来好像工作量太大了CourseTable::setItemDelegate*()
那么,你知道我如何在不重写代码的情况下干净利落地完成1和2吗?为什么你不能同时过滤事件以开始编辑 如果状态为!=QBStractItemView::EditingState 在此函数中返回true将使事件停止传播到过滤对象 如果状态为编辑,则只需返回False并允许表和编辑器继续处理事件 大概是这样的:
bool FilterObject::eventFilter(QObject *object, QEvent *event)
{
if (object == tableView && event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Return && tableView->state() != QAbstractItemView::EditingState) {
// set current cell to edit
return true;
} else
return false;
}
return false;
}
bool FilterObject::eventFilter(QObject*object,QEvent*event)
{
if(object==tableView&&event->type()==QEvent::KeyPress){
QKeyEvent*keyEvent=静态广播(事件);
if(keyEvent->key()==Qt::key\u Return&&tableView->state()!=qabstractemview::EditingState){
//将当前单元格设置为编辑
返回true;
}否则
返回false;
}
返回false;
}
因此,QWidget*QItemDelegate::createEditor()
原来是一个const
函数,所以我甚至无法将指向已创建编辑器的指针保存在成员变量中。