如何知道QTreeView项目装饰被点击

How to know the QTreeView item decoration is clicked

本文关键字:何知道 QTreeView 项目      更新时间:2023-10-16

我想知道当用户选择一个项目的装饰,因为我试图实现一个单一的点击展开/折叠QTreeview和装饰现在什么都不做。它不会展开或折叠项目,如果我点击项目,它会正常工作。

void MyTreeView::mousePressEvent(QMouseEvent *event)
{
    QTreeView::mousePressEvent(event);
    if (event->button() == Qt::LeftButton)
    {
        QModelIndex index = indexAt(event->pos());
        isExpanded(index) ? collapse(index) : expand(index);
    }
}

问题是,当装饰被选中时,它进入if条件。如果不是,一切正常。

我不知道我是否必须阻止装饰动作或在if语句中添加条件。

我如何知道装饰物被选中了,而不是项目本身,或者我如何阻止装饰动作

试试这个:

void MyTreeView::mousePressEvent( QMouseEvent* aEvent )
{
    QModelIndex index = indexAt( aEvent->pos() );
    if ( index.isValid() )
    {
        const bool wasExpanded = isExpanded( index );
        QTreeView::mousePressEvent( aEvent );
        if ( aEvent->button() == Qt::LeftButton )
        {
            const bool expanded = isExpanded( index );
            // QTreeView did not change the item's state ... but you want.
            if ( wasExpanded == expanded )
            {
                expanded ? collapse( index ) : expand( index );
            }
        }
    }
    else
    {
        QTreeView::mousePressEvent( aEvent );
    }
}