In Qt wie erhalte ich eine Taste drückt eine Spinnbox auf einen bestimmten Wert zu setzen?

StackOverflow https://stackoverflow.com/questions/815002

  •  03-07-2019
  •  | 
  •  

Frage

Ich versuche, in den Griff zu Qt-Signal und Schlitze Mechanismus zu erhalten. Ich habe eine App mit einem QPushButton und einem QSpinBox. Wenn ich auf die Schaltfläche klicken Ich möchte die Spinnbox bis 20 ändern, was Signal und Slot muss ich einrichten?

Der folgende Code zeigt die App, die Verbindungsfunktion der ist Ich habe Probleme mit. Wie ich es die setValue (int) -Slot von QSpinBox verstehen wird hier nicht funktionieren, da die clicked () Signal von QPushButton eine andere Signatur hat, und trotzdem wie würde ich den Wert 20 an der Spinnbox passieren? Muss ich irgendeine Art von Hilfsfunktion schreiben als einen Schlitz zu handeln, die spinbox- ruft> setValue (20)? Wenn ja, in welcher Form würde das dauern?

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    QSpinBox *spinbox = new QSpinBox;
    QPushButton *button = new QPushButton("Set to 20");

    spinbox->setRange(0, 100);

    // What should I put below?
    QObject::connect(button, SIGNAL(clicked()), spinbox, SLOT(???????));

    QLayout *layout = new QHBoxLayout;
    layout->addWidget(spinbox);
    layout->addWidget(button);
    window->setLayout(layout);

    window->show();

    return app.exec();

}
War es hilfreich?

Lösung

Sie können entweder:

class AuxSignals : public QObject
{
    Q_OBJECT
    ...
    signals:
        void valueChanged(int);
    public slots:
        void buttonClicked() { emit valueChanged(20); }
};

...

// On main.cpp
AuxSignals *auxSignals = new AuxSignals;

QObject::connect(button, SIGNAL(clicked()), auxSignal, SLOT(buttonClicked));
QObject::connect(auxSignals, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));

oder

class AuxSignals : public QObject
{
    Q_OBJECT
    ...
    QSpinBox *m_spinBox;
    public:
        AuxSignals(QSpinBox *spinBox) : m_spinBox(spinBox) {}
    public slots:
        void buttonClicked() { m_spinBox->setValue(20); }
};

...

// On main.cpp
AuxSignals *auxSignals = new AuxSignals(spinBox);

QObject::connect(button, SIGNAL(clicked()), auxSignals, SLOT(buttonClicked()));

Ich ziehe es die erste Option, weil es nicht die AuxSignals Klasse erfordert einen Zeiger auf eine bestimmte QWidget zu haben.

Andere Tipps

Ich glaube, Sie in einem benutzerdefinierten SCHLITZ suchen hier. Ein QPushButton::clicked Signal wird ein boolean (true|false) Ereignis geben. Wenn Sie es mit QSpinBox::setValue fangen Sie nicht sehr weit gehen. Die QSpinBox::setValue erwartet einen int und wandelt den Eingang boolean 0 oder 1 ist wie in dem Fall vielleicht und Ihre Spinnbox Inkremente von nur 1 Einheit. Wenn Sie eine benutzerdefinierte schreiben waren SLOT Sie tatsächlich den genauen Reglerwert mit weit mehr Kontrolle einstellen.

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