Frage

Ich schreibe eine vereinfachte Rechner mit Qt mit C ++, für Lernzwecke. Jede Nummer ist ein QPushButton, die den gleichen Steckplatz verwendet den Text in einem LineEdit Widget zu ändern als Anzeige verwendet wird.

Der Steckplatz verwendet die Sender () Methode, um herauszufinden, welche Taste gedrückt wurde, so dass die richtige Zahl würde auf dem Display-Widget geschrieben werden.

Um alle zu haben die Tasten arbeiten, würde ich haben eine Verbindung zu jedem von ihnen zu schreiben, ein bisschen wie folgt aus:

connect(ui->button1, SIGNAL(clicked()), this, SLOT(writeNum()));

Da sie alle den gleichen Steckplatz verwenden, das einzige, was die Taste ändert verwendet wird, so dass der nächste Sender ui->button2 würde, ui->button3, und so weiter. Meine Frage ist, gibt es eine Möglichkeit, die Anzahl der definierten Verbindungen zu reduzieren?

Edit: Hier 'sa nützlichen Link genau über dieses Problem diskutiert, im Detail.

War es hilfreich?

Lösung

Wenn Sie QtDesigner oder das Formular-Editor von QtCreator verwenden, können Sie einfach per Drag Linien zwischen 2 und es wird für Dich im Code füllen.

Sie können auch alle Tasten in einer Listenstruktur halten, aber ich würde verwenden eine QVector ist kein Standard-Array.

Sie mögen vielleicht auch mit der sender() Methode zu überdenken, verletzt es OOP-Design. Stattdessen verbindet alle Tasten auf ein QSignalMapper und dann mapped() zu Ihrem Textfeld verbinden.

Andere Tipps

Sie sollten einen int in diesem Fall verwenden Sie die Taste zu identifizieren, die das Signal an den Schlitz gesendet. Im Wesentlichen verwenden Sie QSignalMapper für diese Aufgabe:

QSignalMapper sm;

QPushButton* one = new QPushButton(this);
QPushButton* two = new QPushButton(this);
QPushButton* three = new QPushButton(this);
//and so on...

sm.setMapping(one, 1);
sm.setMapping(two, 2);
sm.setMapping(three, 3);
//and so on...

connect(one,  SIGNAL(clicked()), &sm, SLOT(map()));
connect(two,  SIGNAL(clicked()), &sm, SLOT(map()));
connect(three,  SIGNAL(clicked()), &sm, SLOT(map()));
//and so on...



connect(&sm, SIGNAL(mapped(int)), this, SLOT(yourslothere(int)));

Hinweis: QSignalMapper sehr nützlich ist, sollte man nicht vergessen;)

Ich glaube, Sie können versuchen, die QPushButton in einem Array Zuweisung, so etwas wie diese

QPushButton* numbers = new QPushButton[10];

Und dann führen Sie die Verbindungen eines for-Schleife mit

for(size_t i = 0; i < 9; ++i)
{
  connect(numbers[i],SIGNAL(clicked()),this,SLOT(writeNum()));
}

Aber ich glaube nicht, es lohnt sich. Explizite Verbindung, während machen Sie den Code eines ausführlichen, stellt die Verbindungen mehr den Leser klar.

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