アイテムが入っていないQTreeViewの一部をクリックして、QTreeViewのアイテムの選択を解除できるようにしたいのですが、とにかくこれを行う方法が見つからないようです。アイテム上にないクリックをインターセプトしますが、QTreeViewにclicked
シグナルがないため、これを行う方法を理解できません。
8 に答える
@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
ヤシール
これは実際には非常に単純です (PyQt の場合):
class DeselectableTreeView(QtGui.QTreeView):
def mousePressEvent(self, event):
self.clearSelection()
QtGui.QTreeView.mousePressEvent(self, event)
Qt はmousePressEvent
を発行するために使用しclicked
ます。イベントを送信する前に選択をクリアすると、項目をクリックすると選択され、それ以外の場合は何も選択されません。これを手伝ってくれたパトリスに感謝します:)
私の場合、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);
}
};
これは本当にうまくいきます。
エリック
QTreeView
信号を持つQAbstractView
( http://doc.qt.digia.com/4.6/qtreeview.html )から継承します。clicked
問題は、インデックスが有効な場合にのみシグナルが発行されるため、このシグナルで目的を達成できないことです。
mousePressEvent
代わりに をインターセプトしてみてください。この関数では、ユーザーがクリックした場所を見つけ、必要に応じて選択したアイテムの選択を解除できます。
@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
ウィジェットに別の選択モードを設定してみてください。それらのいずれかがあなたが望むものを完全にカバーしているかどうかはわかりません(単一選択ですが、選択解除可能です)。