Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 为“QModelIndex”获取“QWidget*编辑器”时遇到问题`_Qt_Qt4_Qtableview_Model View - Fatal编程技术网

Qt 为“QModelIndex”获取“QWidget*编辑器”时遇到问题`

Qt 为“QModelIndex”获取“QWidget*编辑器”时遇到问题`,qt,qt4,qtableview,model-view,Qt,Qt4,Qtableview,Model View,我在扩展的默认编辑行为时遇到问题。按下Enter键时,我需要以下行为: 如果当前单元格尚未编辑,则开始编辑该单元格 如果正在编辑单元格, 2a。提交数据并关闭编辑器。那么 2b。使下面的单元格(如果存在)成为当前单元格 2a是默认行为,2b可能通过在的重新实现中使用实现(如类似上下文中所建议的) 问题在于实现1。我在下面列出了我迄今为止尝试过的方法 重新配置“平台编辑键”默认情况下,“当在项目上按下平台编辑键时,编辑开始。”()此键在我的平台上为F2(Ubuntu 12.04)。我可以将平

我在扩展的默认编辑行为时遇到问题。按下Enter键时,我需要以下行为:

  • 如果当前单元格尚未编辑,则开始编辑该单元格
  • 如果正在编辑单元格,
    • 2a。提交数据并关闭编辑器。那么
    • 2b。使下面的单元格(如果存在)成为当前单元格
  • 2a是默认行为,2b可能通过在的重新实现中使用实现(如类似上下文中所建议的)

    问题在于实现1。我在下面列出了我迄今为止尝试过的方法

    • 重新配置“平台编辑键”默认情况下,“当在项目上按下平台编辑键时,编辑开始。”()此键在我的平台上为F2(Ubuntu 12.04)。我可以将平台编辑键重新配置为输入,但
      • 改变平台默认值似乎是个坏主意
      • 我不知道怎么做
    • 捕获回车键,我使用以下方法执行此操作:

      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 */
      }
      
      这确实捕获了回车键并完成了1(从上面),但现在2被破坏。因此,我需要查看上面
      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
    函数,所以我甚至无法将指向已创建编辑器的指针保存在成员变量中。