Qt:在DoubleClick Only上选择TreeView项目

时间:2018-04-03 17:43:48

标签: c++ qt select treeview double-click

我希望仅在doubleClick事件之后选择(突出显示)我的TreeView项目。即,应忽略单击和右键单击事件,不应突出显示TreeView中的项目。我正在使用带有QStandardItemModel的TreeView。我试过了:

  1. 单击功能on_treeViewFiles_clicked()取消选择项目
  2. ui->treeViewFiles->clearSelection();
    
    1. 然后在doubleClick函数内
    2. void MyApp::on_treeViewFiles_doubleClicked(const QModelIndex &fileidx)
      

      使用

      选择了一个项目
      ui->treeViewFiles->selectionModel()->select(fileidx, QItemSelectionModel::Rows);
      
      1. 还尝试设置当前索引

        ui->treeViewFiles->setCurrentIndex(fileidx);

      2. 嗯,上面的代码确实没有任何内容,只有突出显示才会被忽略。

        1. 我尝试了一个eventFilter,但没有用,建议?
        2. bool MyApp::eventFilter(QObject *watched, QEvent *event)
          {
              if(event->type() == QEvent::MouseButtonPress)
              {
                  QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
                  if(mouseEvent->button() == Qt::LeftButton)
                  {
                      qDebug() << "clicked";
                      return true;
                  }
              else
                      return false;
              }
              return false;
          }
          

          PS。尝试使用keyEvent->key() == Qt::Key_Down类似的eventFilter,它可以工作。

          [解决]

          有趣的是。过滤器必须安装在键盘键的 treeView 上,鼠标点击的 TreeView-&gt; ViewPort 上。而不是

          ui->treeViewFiles->installEventFilter(this);
          

          必须在视口上安装过滤器

          ui->treeViewFiles->viewport()->installEventFilter(this);
          

          [解决方案2]

          找到一个非常简单但强大的解决方案。首先在构造函数中禁用选择模式。

          ui->treeViewFiles->setSelectionMode(QAbstractItemView::NoSelection);
          

          然后在你的doubleClick函数

          void MyApp::on_treeViewFiles_doubleClicked(const QModelIndex &fileidx)
          

          启用和禁用TreeView的选择模式,以便

          ui->treeViewFiles->setSelectionMode(QAbstractItemView::SingleSelection);
          ui->treeViewFiles->selectionModel()->select(fileidx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
          ui->treeViewFiles->setSelectionMode(QAbstractItemView::NoSelection);
          

0 个答案:

没有答案