Ich habe eine Qt-Anwendung in C ++ und ich möchte einen Slot einem QPushButton zuweisen. Aber ich möchte einige Argumente weitergeben, weil ich mehr als einen QPushButton habe, der ähnliche Dinge macht, also möchte ich eine Funktion, aber mit einem Parameter darin, aber Qt sagt mir immer wieder, dass es keinen solchen Slot gibt. Kann mir jemand sagen, warum und wie soll ich es machen?
Vielen Dank im Voraus
In der .h-Datei habe ich: (es war am Anfang privat, aber ich änderte es bei der Suche nach dem Problem)
%Vor%Dann in der .cpp:
%Vor%Und wieder in derselben .cpp:
%Vor% Dies geschieht in zwei verschachtelten Schleifen, so dass i
und j
gut definiert sind.
Und mein Fehler ist:
%Vor% Ich habe etwas im Internet gelesen, dass ich handleButton(int, int);
sagen sollte, aber wie soll ich dann die Argumente weitergeben?
Leider akzeptiert eine Qt-Signal-Slot-Verbindung keine Argumente, die beim Aufruf des Signals an den Slot übergeben werden. Dies funktioniert nur, wenn das Signal selbst diese Argumente bereitstellt, aber Sie können sie nicht in einer connect
-Anweisung hinzufügen.
Aber du bist nicht der Einzige, der das machen möchte, also gibt es in Qt eine Klasse, die fast was du willst: QSignalMapper
. Eine Instanz dieser Klasse kann als "Proxy" für eine Signal-Slot-Verbindung verwendet werden: Sie verbinden (mehrere) Schaltflächen mit einem Slot dieser Klasse und verbinden ein Signal dieser Klasse mit Ihrem Ziel-Slot. Dann können Sie für jede "Sender" -Instanz (in Ihrem Fall Schaltflächen) der Klasse mitteilen, welcher Wert dem aufgerufenen Slot hinzugefügt werden soll. Beispiel:
Wie Sie sehen können, kann diese Klasse leider nur einen einzelnen Parameter verarbeiten. Für Ihren Fall sollten Sie eine andere Methode wählen (ich erklärte das oben, falls Sie erneut ein ähnliches Problem haben, aber mit einem einzelnen int
-Parameter).
Die Alternative, die zu Ihrem Problem passt, ist, sich auf sender()
im Slot zu verlassen. Merken Sie sich Ihr Mapping in einer Datenstruktur wie
und greifen Sie auf diejenigen in Ihrem Slot zu, die kein Argument annehmen:
%Vor% Natürlich müssen Sie bei der Initialisierung Ihrer Benutzeroberfläche entsprechende Werte in diese Maps einfügen. Oder Sie könnten Ihre Schaltfläche in Ihrem vorhandenen Array buttonsField
suchen.
Seit Qt5 und C ++ 11 gibt es eine andere Methode: Anstelle eines Slots können Sie die Signale in einer Lambda-Funktion behandeln. Das würde so aussehen (das Signal wird mit einer neuen Syntax benannt):
%Vor%Wenn Ihnen die Lambda-Syntax nicht gefällt, können Sie auch einige Helfer aus der Standardbibliothek verwenden, um einen Funktor anstelle eines Lambdas zu erstellen, oder Sie können Ihre eigene Funktorklasse schreiben, aber persönlich finde ich das Lambda sehr gut lesbar .
Tags und Links c++ qt qt5 qpushbutton qobject