15

アイテムが入っていないQTreeViewの一部をクリックして、QTreeViewのアイテムの選択を解除できるようにしたいのですが、とにかくこれを行う方法が見つからないようです。アイテム上にないクリックをインターセプトしますが、QTreeViewにclickedシグナルがないため、これを行う方法を理解できません。

4

8 に答える 8

18

@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

ヤシール

于 2012-05-31T02:40:38.440 に答える
12

これは実際には非常に単純です (PyQt の場合):

class DeselectableTreeView(QtGui.QTreeView):
    def mousePressEvent(self, event):
        self.clearSelection()
        QtGui.QTreeView.mousePressEvent(self, event)

Qt はmousePressEventを発行するために使用しclickedます。イベントを送信する前に選択をクリアすると、項目をクリックすると選択され、それ以外の場合は何も選択されません。これを手伝ってくれたパトリスに感謝します:)

于 2010-05-04T20:59:12.420 に答える
9

私の場合、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);
    }

};

これは本当にうまくいきます。

エリック

于 2011-02-22T08:40:54.657 に答える
7

QTreeView信号を持つQAbstractView( http://doc.qt.digia.com/4.6/qtreeview.html )から継承します。clicked問題は、インデックスが有効な場合にのみシグナルが発行されるため、このシグナルで目的を達成できないことです。

mousePressEvent代わりに をインターセプトしてみてください。この関数では、ユーザーがクリックした場所を見つけ、必要に応じて選択したアイテムの選択を解除できます。

于 2010-05-04T06:15:43.443 に答える
1

@Skilldrickの回答に追加するには、Qt Designer を使用しているために既にインスタンス化されているビューにこれを適用する必要がある場合は、次のようにすることができます。

import new
def mousePressEvent(self, event):
    self.clearSelection()
    QtGui.QTableView.mousePressEvent(self, event)
self.ui.tableView.mousePressEvent = new.instancemethod(mousePressEvent, self.ui.tableView, None)

これは、ビューがself.ui.tableView.

この回答のおかげで: https://stackoverflow.com/a/1647616/1300519

于 2016-01-13T16:19:39.097 に答える
0

ウィジェットに別の選択モードを設定してみてください。それらのいずれかがあなたが望むものを完全にカバーしているかどうかはわかりません(単一選択ですが、選択解除可能です)。

于 2010-05-04T14:49:13.927 に答える