2016-06-21 28 views
0

Ich benutze QtDesigner (4.8.7), um einen QDialog zu erstellen, der als Hauptinteraktionspunkt für ein QGIS-Plugin dient, das ich erstelle. Der größte Teil der Benutzereingabe wird über verschiedene QLineEdit-Felder eingegeben, von denen einige einen placeholderText-Satz haben.QDialogfelder nicht automatisch fokussieren

Leider wird jedes Mal, wenn der QDialog geöffnet wird, sofort ein QLineEdit-Feld ausgewählt (d. H. Es wird fokussiert), wodurch der PlatzhalterText verschwindet, damit der Benutzer Text eingeben kann. Daher frage ich mich, ob es möglich ist, einen QDialog zu erstellen, der sich nicht automatisch auf ein Feld konzentriert. Dies würde es dem Endbenutzer meines Plugins ermöglichen, die Platzhaltertexte vor der Eingabe eines Wertes selbst zu überprüfen.

ich zur Zeit die QDialog Initialisierung wie folgt:

import PyQt4.QtGui as QTG 
import PyQt4.QtCore as QTC 

from dialog_ui import Ui_dialog 

class UI (object): 
    def __init__(self, iface): 
     # iface is just a way to interact with QGIS 
     self.iface  = iface 

     self.container = QTG.QDialog() 
     self.ui  = Ui_dialog() 

     self.setup() 

    def setup(self): 
     self.ui.setupUi(self.container) 
     # Custom ui setup code follows after this... 

    # Called by an external function 
    def show(self): 
     self.container.exec_() 

Antwort

3

die Tab Order Editing Mode in Qt Designer verwenden.

Starten Sie die Tab-Sortierung für ein Widget, das keinen Platzhaltertext enthält. Dieses Widget wird den ursprünglichen Fokus erhalten.

Alternativ rufen Sie einfach setFocus() auf einem geeigneten Widget vor dem Anzeigen des Dialogfelds.

+0

Dies funktioniert zunächst, aber das Problem tritt erneut auf, sobald der Benutzer ein Feld auswählt. – mathsaey

+2

@mathsaey. Ja - deshalb habe ich die alternative Lösung 'setFocus()' genannt ;-) – ekhumoro

0

Ich ging schließlich für eine Kombination von Ekhumoros Antwort und die Lösung, die ich gefunden here. Der Kern der Lösung besteht darin, clearFocus() auf dem QLineEdit zu verwenden, um den Fokus zu verlieren.

Ich entschied mich dafür zu sorgen, dass QLineEdit den Fokus verliert, wenn der Benutzer auf eine andere Stelle des übergreifenden QDialogs klickt. Der Code sieht folgendermaßen aus:

import PyQt4.QtGui as QTG 
import PyQt4.QtCore as QTC 

from dialog_ui import Ui_dialog 

class CustomDialog (QTG.QDialog): 

    def mousePressEvent(self, event): 
     focusWidget = QTG.QApplication.focusWidget() 
     if focusWidget: 
      focusWidget.clearFocus() 

class UI (object): 
    def __init__(self, iface): 
     # iface is just a way to interact with QGIS 
     self.iface  = iface 

     self.container = CustomDialog() 
     self.ui  = Ui_dialog() 

     # Rest of the code remains unchanged 
+0

Anstatt in ein 'mousePressEvent' zu binden und davon auszugehen, dass dies der einzige Weg ist, den Fokus zu ändern, sollte man' QApplication :: focusChanged' verwenden und entfernen Sie den Fokus von allen untergeordneten Elementen Ihres Dialogfelds. –