Entfernen gepunktete Grenze, ohne NoFocus in Windows PyQt
Gibt es ein paar Fragen auf, SO etwa diese, von denen alle scheinen zu sagen, dass der einzige Weg, um entfernen Sie die gepunktete Linie ist um die focusPolicy auf widgets/Element in Frage zu NoFocus. Das funktioniert zwar als eine temporäre Lösung, dies verhindert eine weitere Interaktion mit sagte widgets/Element in das Reich der anderen notwendigen focusEvents.
Sagte Grenze in Frage:
Hier ist ein Beispiel, warum dies nicht funktioniert.
- Ich habe ein Nicht-Modales popup widget, denken Sie eine lightbox für ein Bild.
- Ich will erkennen, ein mousePressEvent außerhalb des widget und das widget schließen als Ergebnis. Um dies zu tun, sollte ich fangen Sie die focusOutEvent.
- Jedoch, wenn eine große Mehrheit der widgets in meinem Programm als NoFocus (den Rahmen zu entfernen-Problem), dann kann ich nicht fangen die focusOutEvent weil, Sie Ahnen es, Sie haben keinen Fokus der Politik.
Hier ein weiteres Beispiel:
- Habe ich ein QTreeWidget, die als Unterklasse definiert, damit ich fangen kann keyPressEvents aus verschiedenen Gründen.
- Die QTreeWidget ist auch als NoFocus um zu verhindern, dass die Grenze. Da dieser jedoch das widget nie den Fokus hat und daher keine keyPressEvents können gefangen werden.
- Eine Abhilfe für dieses (notdürftigem, imo) ist verwenden Sie das widget ist grabKeyboard Klasse, die gefährlich ist, wenn ich vergesse, releaseKeyboard später. Dies ist nicht optimal.
So dann ist die Frage, gibt es eine Möglichkeit zu entfernen dieses seltsame (meist nur hässlich) gepunktete Linie ohne ausschalten Fokus für alles, was in meiner app? Vielen Dank im Voraus!
- Welche Betriebssystem benutzt du?
- Windows (7), fürchte ich.
- Gut dann könnten Sie eintauchen in eine benutzerdefinierte paintEvent :-/
Du musst angemeldet sein, um einen Kommentar abzugeben.
Set
outline: 0
des gewünschten Objektes. Siehe Folgendes Beispiel, das macht es für einenQTableView
.Werke für
QAbstractItemView
vererbten Klassen. (QTreeWidget, QTableWidget
etc). Überraschend in dieser CSS-Eigenschaft ist nicht erwähnt in der QT-Dokumentation. Sehen QT-Style-Sheet-Referenz-Dokumentation.Auf OSX kann man tun
QWidget.setAttribute(QtCore.Qt.WA_MacShowFocusRect, False)
. Nicht sicher über Win oder Linux. Haben Sie vielleicht, es zu tun durch stylesheets.Meisten Stile delegieren die Zeichnung der Fokus auf die
QStyle::drawPrimitive
Funktion mitPE_FrameFocusRect
als das element gezeichnet werden.So dass Sie sollten in der Lage sein zu deaktivieren, die weltweit mit den folgenden style-Klasse installiert, die auf die Instanz der Anwendung:
PS: Es funktioniert nicht mit
QGtkStyle
für einige widgets (buttons, combobox), so dass es möglicherweise nicht funktioniert für Windows oder Mac, entweder.QProxyStyle
nicht exportiert in python. Und da bestimmte Stile (QWindowsStyle
,QWindowsXPStyle
...) nicht exportiert entweder, man kann nicht einfach überschreiben-Funktion in den aktuellen Stil (ich habe versucht, monkey-patching zu ersetzen drawPrimitive auf dieQApplication.style()
, aber ich bin mir nicht wirklich sicher, ob ich es richtig gemacht habe).Die gepunktete Linie eigentlich Nerven mich auch. Ich google es viele Male, versuchen Sie es über hundert mal, um es zu lösen, aber mit weniger Erfolg. Ich will jetzt die Zusammenfassung der drei typischen Weise vielleicht wissen Sie es schon, aber wir machen es klarer, so dass Sie verstehen können, was Sie wirklich brauchen.
Ersten
QSS
Qss wurde geltend gemacht, da die meisten einfach Weg, das problem zu lösen.
Eigentlich ist es Arbeit ruhig auch unter der nicht root-Rechte, aber unter der Wurzel, die es brach.
non root privilege
root privilege
Also, wenn Ihre Anwendung benötigen root-Privilegien zu laufen, das
QSS
vielleicht nicht Ihren Bedarf anpassen.Sekunde
FrameSheet/FrameShape
Es sieht effektiv, aber es funktioniert auch nicht unter root-Berechtigung wie die oben genannten-Methode.
Dritten
NoFocusDelegate
Vererbung.Dies ist eine großartige Methode ist, das problem zu lösen Privileg irrelevant
Diese Methode mir helfen, um loszuwerden, die gepunktete Linie mystery, ich hoffe, es wird hilfreich sein, um Sie zu.
Können Sie dies mit PyQt5: