是否可以通过单击项目在QTreeView中取消选择?

Ski*_*ick 14 qt pyqt qtreeview

我希望能够通过单击QTreeView中没有项目的部分来取消选择QTreeView中的项目,但我似乎无法找到这样做.我拦截了一个不在项目上的点击,但是QTreeView没有clicked信号,所以我无法弄清楚如何做到这一点.

Yas*_*azk 15

基于@ Eric的解决方案,因为它只取消选择是否选中了点击的项目,这就是我想出的.单击QTreeView的空白区域时,此解决方案也适用

#ifndef DESELECTABLETREEVIEW_H
#define DESELECTABLETREEVIEW_H
#include "QTreeView"
#include "QMouseEvent"
#include "QDebug"
class DeselectableTreeView : public QTreeView
{
public:
    DeselectableTreeView(QWidget *parent) : QTreeView(parent) {}
    virtual ~DeselectableTreeView() {}

private:
    virtual void mousePressEvent(QMouseEvent *event)
    {
        QModelIndex item = indexAt(event->pos());
        bool selected = selectionModel()->isSelected(indexAt(event->pos()));
        QTreeView::mousePressEvent(event);
        if ((item.row() == -1 && item.column() == -1) || selected)
        {
            clearSelection();
            const QModelIndex index;
            selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
        }
    }
};
#endif // DESELECTABLETREEVIEW_H
Run Code Online (Sandbox Code Playgroud)

亚瑟尔

  • +1这就是我想要的. (2认同)

Ski*_*ick 11

这实际上非常简单(在PyQt中):

class DeselectableTreeView(QtGui.QTreeView):
    def mousePressEvent(self, event):
        self.clearSelection()
        QtGui.QTreeView.mousePressEvent(self, event)
Run Code Online (Sandbox Code Playgroud)

Qt mousePressEvent用来发射clicked.如果在发送事件之前清除选择,则如果单击某个项目,则会选择该项目,否则将不会选择任何项目.非常感谢Patrice帮助我解决这个问题:)


小智 8

clearSelection在我的情况下不起作用.我正在使用具有单选模式的树视图.这是我编码的内容:

class DeselectableTreeView : public QTreeView
{
public:
    DeselectableTreeView(QWidget *parent) : QTreeView(parent) {}
    virtual ~DeselectableTreeView() {}

private:
    virtual void mousePressEvent(QMouseEvent *event)
    {
        QModelIndex item = indexAt(event->pos());
        bool selected = selectionModel()->isSelected(item);
        QTreeView::mousePressEvent(event);
        if (selected)
            selectionModel()->select(item, QItemSelectionModel::Deselect);
    }

};
Run Code Online (Sandbox Code Playgroud)

这工作得很好.

埃里克


Pat*_*ola 7

QTreeView继承自QAbstractView(http://doc.qt.digia.com/4.6/qtreeview.html),它有一个clicked信号.问题是只有当索引有效时才会发出信号,因此无法通过此信号实现所需的信号.

试着拦截mousePressEvent而不是.在该功能中,您可以找到用户点击的位置,并根据需要取消选择所选项目.