Qt: Wie kann ich in einem Textfeld Zahlen über Buttonklicks anhängen?

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.


ITNeuling116 
Fragesteller
 21.05.2022, 14:30

Funktioniert leider bei mir nicht.

Mein Code sieht wie folgt aus:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setGeometry(50, 50, 1100, 900);

    _label = new QLabel(this);
    _label->setGeometry(250, 50 , 400 , 250);
    _label->setText("Tresor");
    _label->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
    _label->setMargin(50);

    _labelAusgabe = new QLabel(this);
    _labelAusgabe->setGeometry(650, 250 , 150 , 50);
    _labelAusgabe->setText("Code");
   // _labelAusgabe->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
    _labelAusgabe->setMargin(50);





    QPalette Pal(palette());
    Pal.setColor(QPalette::Window, QColor(0, 0, 0));
    Pal.setColor(QPalette::WindowText, QColor(250, 100 , 150));

    QPalette Pal1(palette());
    Pal1.setColor(QPalette::Window, QColor(100, 100, 150));
    Pal1.setColor(QPalette::WindowText, QColor(0, 0 , 0));



    _label->setPalette(Pal);
    _label->setAutoFillBackground(true);

    _labelAusgabe->setPalette(Pal1);
    _labelAusgabe->setAutoFillBackground(true);

    _button1 = new QPushButton("1", this);
    _button1->setGeometry(50,50,100,100);

    _button2 = new QPushButton("1", this);
    _button2->setGeometry(650,50,50,50);

    _button3 = new QPushButton("2", this);
    _button3->setGeometry(700,50,50,50);

    _button4 = new QPushButton("3", this);
    _button4->setGeometry(750,50,50,50);

    _button5 = new QPushButton("4", this);
    _button5->setGeometry(650,100,50,50);

    _button6 = new QPushButton("5", this);
    _button6->setGeometry(700,100,50,50);

    _button7 = new QPushButton("6", this);
    _button7->setGeometry(750,100,50,50);

    _button8 = new QPushButton("7", this);
    _button8->setGeometry(650,150,50,50);

    _button9 = new QPushButton("8", this);
    _button9->setGeometry(700,150,50,50);

    _button10 = new QPushButton("9", this);
    _button10->setGeometry(750,150,50,50);

    _button11 = new QPushButton("0", this);
    _button11->setGeometry(700,200,50,50);

    _button12 = new QPushButton("<-", this);
    _button12->setGeometry(750,200,50,50);

    _button13 = new QPushButton("*", this);
    _button13->setGeometry(650,200,50,50);


    // Zustandsübergänge
    connect(_button1, SIGNAL(clicked()), this, SLOT(Text()));
    connect(_button2, SIGNAL(clicked()), this, SLOT(ziffer1()));
    connect(_button3, SIGNAL(clicked()), this, SLOT(ziffer2()));
    connect(_button4, SIGNAL(clicked()), this, SLOT(ziffer3()));
    connect(_button5, SIGNAL(clicked()), this, SLOT(ziffer4()));
    connect(_button6, SIGNAL(clicked()), this, SLOT(ziffer5()));
    connect(_button7, SIGNAL(clicked()), this, SLOT(ziffer6()));
    connect(_button8, SIGNAL(clicked()), this, SLOT(ziffer7()));
    connect(_button9, SIGNAL(clicked()), this, SLOT(ziffer8()));
    connect(_button10, SIGNAL(clicked()), this, SLOT(ziffer9()));
    connect(_button11, SIGNAL(clicked()), this, SLOT(ziffer10()));
    connect(_button12, SIGNAL(clicked()), this, SLOT(ziffer11()));
    connect(_button13, SIGNAL(clicked()), this, SLOT(ziffere12()));
    connect(_button13, SIGNAL(clicked()), this, SLOT(ziffere13()));
}

void MainWindow::ziffer1()
{


    _labelAusgabe->setText("1");


}
0
regex9  21.05.2022, 14:43
@ITNeuling116

Das ist nicht verwunderlich, denn du machst ja nicht das, was ich oben geschrieben habe.

0
ITNeuling116 
Fragesteller
 21.05.2022, 14:46
@regex9

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

0
regex9  21.05.2022, 14:57
@ITNeuling116

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.

0
ITNeuling116 
Fragesteller
 21.05.2022, 15:22
@regex9

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

0
regex9  21.05.2022, 15:36
@ITNeuling116

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'); });
0
ITNeuling116 
Fragesteller
 21.05.2022, 16:01
@regex9

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.

0
regex9  21.05.2022, 16:56
@ITNeuling116

Hast du dazu schon in die verlinkte Dokumentation geschaut? Mittels bounded kannst du eine zufällige (bspw. vierstellige) Zahl generieren lassen.

0
ITNeuling116 
Fragesteller
 21.05.2022, 16:59
@regex9

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

0
ITNeuling116 
Fragesteller
 22.05.2022, 15:53
@regex9

Hast du noch vllt eine Idee wie ich das mit dem Code hinbekomme? Ich krieg es leider nicht hin

0
regex9  22.05.2022, 15:58
@ITNeuling116

Woran genau scheiterst du? Zeige dazu deinen Versuch / schildere das Fehlverhalten.

0
ITNeuling116 
Fragesteller
 22.05.2022, 20:14
@regex9

Ich weiß nicht, wie ich den Generator platziere, wie ich den Button verknüpfe um den Code zu überprüfen.

0
regex9  22.05.2022, 22:50
@ITNeuling116

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.

0