Important: Please read the Qt Code of Conduct -

QTreeWidget Click/Pressed event comes AFTER currentItemChanged event?

  • Hi,
    When a row is clicked in a QTreeWidget, why are the Changed() events (itemSelectionChanged and currentItemChanged) issued EARLIER than the Clicked/Pressed events?

    Doesn't it make more sense to have at least the Pressed event come before the Changed events?

  • Interesting observation. what you observe is coded in QAbstractItemView::mouseReleaseEvent

    as you can see d->selectionModel->select is called before emit clicked(index);.

    I can't think of a particular reason why this is the case but that's indeed how the system works.
    such an implementation detail should not be so critical to break your code though

  • @VRonin
    Well, I was hoping to intercept the Clicked or Pressed event to modify the behavior when the item selection (here the complete row, as I use the tree as a list) is changed by directly clicking it, or changed by key up/down press using a simple flag, but due to the behavior described, I need to do it a bit differently.

    Thanks for your explanation!

  • you can always subclass QTreeWidget, add a Q_SIGNAL void clickedBefore(); and reimplement virtual void mouseReleaseEvent(QMouseEvent *event){clickedBefore(); QTreeWidget::mouseReleaseEvent(event);}

  • @VRonin
    Thanks! I also found out that simply installing an event filter on the the QTreeWidget's viewport does the trick: it gets intercepted before the currentItemChanged() event is issued:

    ui->scriptTree->viewport()->installEventFilter(this); //need to install to viewport for mouse events


    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
        if (qobject_cast<QWidget*>(obj) == ui->scriptTree->viewport())
            if (event->type() == QEvent::MouseButtonPress)
                qDebug() << "##### MOUSE PRESSED #####";

    And the output is after clicking on an item:

    ##### MOUSE PRESSED #####
    void __cdecl MainWindow::on_scriptTree_currentItemChanged(class QTreeWidgetItem *,class QTreeWidgetItem *)

    So in the filter, I can add flag "m_wasClicked" or so to modify the behavior of the currentItemChanged code.
    Thanks again!

Log in to reply