Frage

Ich bin neu in der QT-GUI-Programmierung und verwende QT Creator.Das Problem, das ich sehe, liegt an meiner Drucktasten- und Zeilenbearbeitung, wenn der Benutzer die Eingabetaste drückt.Mein Programm öffnet eine Gruppenbox und ermöglicht dem Benutzer, ein Passwort einzugeben und auf OK oder Abbrechen zu klicken.

Wenn der Benutzer die Eingabetaste drückt, während die Zeilenbearbeitung den Fokus hat, scheint das Programm ein zweites Signal für QAbstractButton auszugeben animateClick(); Wenn also das nächste Gruppenfeld geöffnet wird und der Benutzer aufgefordert wird, auf „OK“ oder „Abbrechen“ zu klicken, wird das Programm so fortgesetzt, als ob der Benutzer die Schaltfläche „OK“ gedrückt hätte.

Ich habe meine Drucktasten so eingerichtet, dass der Benutzer die Tabulatortaste drücken und die Eingabetaste drücken kann.Um diese Funktionalität zu erhalten, setze ich okbutton->setAutodefault(true); und cancelButton->setAutodefault(true);

Ich habe auch eine LineEdit-Funktion, in der der Benutzer ein Passwort eingeben und die Eingabetaste drücken kann.Ich habe dies eingerichtet, indem ich das Signal „Zurück gedrückt“ mit der unten gezeigten OK-Taste verbunden habe.

connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));

Ich habe auch versucht, das Return-Pressed-Signal direkt mit dem Steckplatz zu verbinden, aber das Problem tritt immer noch auf.

connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(chkPassword()));

Wenn der Benutzer mit der Maus auf den okButton klickt oder ich okButton-> einstellesetAutoDefault(false); Das Programm funktioniert wie es soll.Ich würde gerne wissen, ob es möglich ist, das animateClick-Signal zu deaktivieren, das auftritt, wenn die Zeilenbearbeitung den Fokus hat.

Jede Hilfe dabei wäre sehr dankbar.

War es hilfreich?

Lösung

Versuchen Sie, niemals eine Verbindung herzustellen lineEdit mit dem okButton, d.h.Kommentieren Sie diese Zeile in Ihrem Code aus:

connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));

und prüfen Sie, ob sich das Programm so verhält, wie Sie es möchten.


Vielleicht möchten Sie auch anrufen

okButton->setDefault(true);

zusätzlich zu Ihrem setAutoDefault() Aufrufe auf beiden Tasten, je nachdem, was genau passieren soll, wenn der Benutzer drückt Eingeben mit verschiedenen Dingen im Fokus.Sehen diese Antwort Weitere Informationen zu diesem Thema finden Sie hier.


Ich gehe davon aus, dass Sie nicht anrufen, da Sie es nie erwähnen setDefault() für jeden Ihrer Knöpfe.Daher, okButton ist Ihr erster Knopf mit dem autoDefault Eigenschaft festgelegt auf true.Das bedeutet, dass okButton wird zur „Schaltfläche der Wahl“ des Dialogs, wann immer der Dialog eine bearbeiten muss Eingeben Tastendruck, der bei keinem anderen passiert ist autoDefault Schaltfläche (z. B cancelButton in Ihrem Fall).

Jedes Mal, wenn ein Widget in Ihrem Dialog eine erhält Eingeben Wenn Sie einen Tastendruck ausführen und das Ereignis selbst nicht verbrauchen, wird das Ereignis letztendlich von der Standardschaltflächenverarbeitungslogik des Dialogs verarbeitet, was zu einem Klick auf die oben genannte „Schaltfläche Ihrer Wahl“ führt.

QLineEdit wird nicht für die mehrzeilige Bearbeitung verwendet und verbraucht daher wahrscheinlich nicht das Tastendruckereignis für Eingeben (Während es noch bearbeitet wird, indem es die aussendet returnPressed() Signal).Somit ist Ihre Verbindung von returnPressed() am Ende tut, was auch immer es tut, und zusätzlich, führt die Standardschaltflächenlogik dazu, dass Sie ein zweites Mal auf Ihre Schaltfläche klicken.

Schauen Sie auch vorbei Dieser Thread in den Qt-Projektforen was das gleiche Problem scheinbar anders löst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top