Ich möchte in der Lage sein, Elemente in meinem QTreeView abzuwählen, indem ich in einen Teil von QTreeView klicke, in dem sich keine Elemente befinden, aber ich kann trotzdem nicht finden, dass ich dies tue. Ich würde einen Klick abfangen, der nicht auf einem Objekt liegt, aber QTreeView hat kein clicked
-Signal, daher kann ich nicht herausfinden, wie das geht.Ist es möglich, in einem QTreeView abzuwählen, indem Sie auf ein Element klicken?
Antwort
Das ist eigentlich ganz einfach (in PyQt):
class DeselectableTreeView(QtGui.QTreeView):
def mousePressEvent(self, event):
self.clearSelection()
QtGui.QTreeView.mousePressEvent(self, event)
Qt mousePressEvent
clicked
zu emittieren, verwendet. Wenn Sie die Auswahl vor dem Senden des Ereignisses löschen, wird bei Auswahl eines Elements diese ausgewählt, andernfalls wird nichts ausgewählt. Vielen Dank an Patrice für die Hilfe mit diesem :)
QTreeView
erbt von QAbstractView
(http://doc.qt.digia.com/4.6/qtreeview.html), die ein Signal clicked
hat. Das Problem ist, dass das Signal nur dann ausgegeben wird, wenn der Index gültig ist, so dass Sie mit diesem Signal nicht erreichen können, was Sie wollen.
Versuchen Sie stattdessen, die mousePressEvent
abzufangen. In der Funktion können Sie feststellen, wo der Benutzer geklickt hat und das ausgewählte Element bei Bedarf abwählen.
Sie könnten versuchen, eine andere selection mode für Ihr Widget zu setzen. Ich weiß nicht, ob einer von ihnen das deckt, was Sie wollen (einfache Auswahl, aber abwählbar).
Ich konnte nichts darin sehen, das würde erreichen, was ich wollte, aber trotzdem danke. – Skilldrick
Die clearSelection funktioniert nicht in meinem Fall. Ich verwende Baumansichten mit einem einzigen Auswahlmodus. Hier ist, was ich codiert habe:
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);
}
};
Das funktioniert wirklich gut.
Eric
Basierend auf @ Eric-Lösung und wie sie abgewählt nur, wenn das geklickt Element ausgewählt wurde, hier ist das, was ich kam mit. Diese Lösung funktioniert auch, wenn Sie den leeren Bereich des
QTreeView klicken#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
Yassir
+1 Das war, was ich gesucht habe. – aardvarkk
'indexAt' könnte ziemlich teuer sein, Sie könnten' item' anstelle des zweiten Anrufs verwenden. 'item.isValid()' ist wahrscheinlich eine bessere Wahl als den Vergleich von Zeile und Spalte mit '-1'. Auch scheint es, die Auswahl zu ändern, wenn Sie auf Elemente klicken? –
Hinzufügen zu @Skilldrick ‚s Antwort, wenn Sie diese auf eine Ansicht anwenden müssen, das bereits instanziiert, weil Sie Qt Designer verwenden, können Sie etwas tun:
import new
def mousePressEvent(self, event):
self.clearSelection()
QtGui.QTableView.mousePressEvent(self, event)
self.ui.tableView.mousePressEvent = new.instancemethod(mousePressEvent, self.ui.tableView, None)
Dies setzt voraus, dass Ihre Ansicht self.ui.tableView
ist.
Dank dieser Antwort: https://stackoverflow.com/a/1647616/1300519
In der Antwort von @Skilldrick, riskieren wir das Senden überflüssig Ereignisse. Wenn ein Element bereits ausgewählt ist und wir erneut darauf klicken, heben wir ausgewählte und ausgewählte Ereignisse auf. Basierend auf anderen Listenern in Ihrer Anwendung ist dies möglicherweise nicht das, was Sie möchten.
Die Lösung von @ eric-maeker hebt nur dann eine Auswahl auf, wenn wir sie erneut anklicken, während sie bereits ausgewählt ist. Streng genommen ist dies nicht die Antwort auf die ursprüngliche Frage, wie man das ausgewählte Objekt abstößt, wenn man woanders anklickt.
@ yassir-ennazk kommt nahe, aber wie von @ adrian-maire aufgezeigt, ist die Lösung nicht optimal. event->pos()
wird zweimal ausgewertet. Außerdem wird das Mausereignis immer durch Aufrufen von QTreeView::mousePressEvent
ausgewertet.
Hier ist die Lösung, die ich mir ausgedacht habe, basierend auf den anderen oben genannten Antworten. Wenn Sie auf einen Punkt klicken, an dem ein anderer Strukturansicht-Eintrag vorhanden ist, wird der neue Eintrag ausgewählt, indem das Ereignis an die Adresse TreeView
weitergeleitet wird. Wenn nicht, löschen wir die Auswahl.
Beachten Sie, dass dies auch für QTreeWidget
s funktioniert.
virtual void mousePressEvent(QMouseEvent* event)
{
QModelIndex item = indexAt(event->pos());
if (item.isValid())
{
QTreeView::mousePressEvent(event);
}
else
{
clearSelection();
const QModelIndex index;
selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
}
}
Das einzige Problem mit der Standardimplementierung ist, dass die Auswahl nicht gelöscht wird, wenn auf einen leeren Bereich der Ansicht geklickt wird. Prüfen Sie also, ob der Index als pos gültig ist. Wenn nicht, rufen Sie 'clearSelection()' auf. Rufen Sie dann bedingungslos die Basisklasse 'mousePressEvent' auf. – ekhumoro
- 1. Ist es möglich, mobile Safari zu öffnen, indem Sie auf eine URL in einem WebView einer App klicken?
- 2. QT QTreeView klicken Ereignis auf spezifische Spalte
- 3. Es ist nicht möglich, auf ein Element von 'onclick' partiellen Wert zu klicken. Sogar xpath
- 4. Navigieren Sie ein Array von Funktionen, indem Sie auf klicken
- 5. Ist es möglich, einem Element basierend auf einem anderen Element Stil/CSS zuzuordnen?
- 6. Deaktivieren Sie ein Element in einer Javafx-ListView beim Klicken auf
- 7. Ändern Sie die Spaltengröße, indem Sie auf klicken - Bootstrap
- 8. Klicken Sie auf ein Element in Robot Framework Selenium
- 9. Ist es möglich, ein Element in einem Elternelement ein-/auszublenden, ohne erneut zu rendern?
- 10. Finden und klicken Sie auf ein Element von "onclick" Teilwert
- 11. Klicken Sie auf ein Element mit einem variablen Attributwert in einem bestimmten Format mit CasperJS
- 12. QTreeview mit Element C++ füllen
- 13. Klicken Sie nicht auf Element in Phantom
- 14. Ist es möglich, ein Netzlaufwerk% PATH% Umgebungsvariable
- 15. Klicken auf ein Element ändert seine Position
- 16. Ist es möglich, dass ein HashMap-Schlüssel einem Element in einer verknüpften Liste zugeordnet ist?
- 17. JavaScript - Klicken Sie auf ein Element und löschen Sie es aus dem übergeordneten div?
- 18. Datenreihen umschalten, indem Sie im Flotendiagramm auf die Legende klicken?
- 19. jQuery: Öffnen Sie das Datei-Upload-Fenster, indem Sie auf einen Link oder ein Bild klicken.
- 20. Ist es möglich, ein data.frame in einem Vektor in R
- 21. Ist es möglich, List.Contains automatisch zu behandeln, indem Sie eine Eigenschaft des Elements vergleichen?
- 22. Ist es möglich, ein Ladenfeld in Lucene
- 23. Füllen Sie verschiedene Gridview, indem Sie auf andere Schaltfläche klicken
- 24. Ist es möglich, eine Textdatei und ein Bild zusammenzuführen, indem Sie nur das Windows-Skript verwenden?
- 25. Wie Sie JPanel hinzufügen, indem Sie auf JButton klicken?
- 26. Klicken Sie auf das nächste Element
- 27. Listbox-Element klicken Sie auf Animation Toolkit?
- 28. Aktivieren Sie ein Kontrollkästchen, indem Sie auf eine Bootstrap-Tabellenzelle klicken
- 29. Ist es möglich, jQuery.click nur für das oberste Element auszulösen?
- 30. Wie Sie andere Aktivität aufrufen, indem Sie auf ein Element unter Überlauf-Symbol in der Aktionsleiste klicken
Danke. Ich habe meine eigene Antwort hinzugefügt, aber +1, weil du mir dabei geholfen hast! – Skilldrick
Gern geschehen Skilldrick –