Qt: Wie kann ich in einem Textfeld Zahlen über Buttonklicks anhängen?
Hallo,
ich baue gerade einen Tresor in einem Qt Widget und habe schon die Buttons 1-10. Nun wollte ich, dass in einem Textfeld die Zahlen hintereinander angezeigt werden, wenn man halt ein bzw. mehrere Buttons drückt.
Meine Lösung sieht so für alle Buttons von 1-10 aus:
_labelAusgabe = new QLabel(this);
_labelAusgabe->setGeometry(650, 250 , 150 , 50);
_labelAusgabe->setText("Code");
// _labelAusgabe->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
_labelAusgabe->setMargin(50);
Die ist aber nicht sehr hilfreich, da die Zahl immer wieder verschwindet, sobald man einen anderen Button betätigt.
Vielleicht hat jemand eine andere Lösung? Vielen Dank.
1 Antwort
Zuerst einmal bräuchtest du Slots, die auf die Klicks deiner Buttons reagieren. Für einen Button mit der Beschriftung 1 könnte das Anküpfen des Slots so aussehen:
QPushButton* button1 = new QPushButton("1", /* ... */);
QObject::connect(button1, &QPushButton::clicked, [=]() { this->addToTextField('1'); });
Und in der addToTextField-Methode liest du erst den alten Wert aus, hängst dann die Zahl an und schreibst das Ergebnis zurück in das Feld.
void YourClass::addToTextField(const QChar& value) {
_yourLineEdit->setText(_yourLineEdit->text().append(value));
}
Mit setText selbst wird kein Text angehängt, sondern stets der aktuelle Wert überschrieben.
Das ist nicht verwunderlich, denn du machst ja nicht das, was ich oben geschrieben habe.
das habe ich eben versucht. ich habe es nun erneut versucht, nun scheint es zu klappen. ich probiere es gerade aus, vielen dank für deine mühe schonmal. Hättest du evtl eine Idee, wie ich dazu ein "Pin" erstelle, z.B bei 1234 wird der Tresor "Geöffnet"? das würde mir sehr weiterhelfen
Seit Qt 5.10 gibt es den QRandomGenerator. Mit dem kannst du auch Zahlen innerhalb eines bestimmten Bereichs generieren lassen.
quint32 pin = QRandomGenerator::global()->bounded(1000, 10000);
Für die Prüfung des Pins kann man einen weiteren Button anlegen und bei Klick auf diesen prüfen, ob Pin und Eingabe übereinstimmen.
Super Vielen dank.Proier ich gleich aus.
Bei QObject::connect(button1, &QPushButton::clicked, [=]() { this->addToTextField('1'); });
kommt leider immer der fehler "Pass a context object as 3rd connect parameter [clazy-contect-3arg-lambda] in gelb dahinter
Das ist soweit nur eine Warnung. Du kannst stattdessen eine andere Überladung wählen, bei der du als drittes Argument noch this als Kontextobjekt angibst. Daran kann sich die Anwendung orientieren, wie lange der Kontext des Lambdas noch gültig ist.
QObject::connect(button1, &QPushButton::clicked, this, [=]() { this->addToTextField('1'); });
Super jetzt klappt soweit alles. Nur das mit dem Pin versteh ich leider nichts ganz. Ich möchte gerne ein Pin erstellen und mit einem Button überprüfen lassen.
Hast du dazu schon in die verlinkte Dokumentation geschaut? Mittels bounded kannst du eine zufällige (bspw. vierstellige) Zahl generieren lassen.
Ja. Ich bin neu in C++, ich versteh das alles noch nicht ganz, deswegen die ganzen Fragen 😅
ich hab das eben selbständig versucht, leider kommen dabei nur Haufen Fehler bei raus
Hast du noch vllt eine Idee wie ich das mit dem Code hinbekomme? Ich krieg es leider nicht hin
Woran genau scheiterst du? Zeige dazu deinen Versuch / schildere das Fehlverhalten.
Ich weiß nicht, wie ich den Generator platziere, wie ich den Button verknüpfe um den Code zu überprüfen.
Slots mit Buttons hast du doch schon einmal verknüpft. Schau in deinen obigen Code. In der Slot-Funktion lässt du die Zufallszahl generieren, konvertierst sie zu einem String und vergleichst diesen mit dem Text des Labels.
Funktioniert leider bei mir nicht.
Mein Code sieht wie folgt aus: