In Qt come faccio a premere un pulsante per impostare una casella di selezione su un determinato valore?
-
03-07-2019 - |
Domanda
Sto cercando di fare i conti con il meccanismo di segnale e slot di Qt. Ho un'app con un QPushButton e un QSpinBox. Quando faccio clic sul pulsante, desidero che la casella di selezione cambi in 20. Quale segnale e slot devo impostare?
Il codice seguente mostra l'app, la funzione di connessione è quella con cui ho problemi. A quanto ho capito, lo slot setValue (int) di QSpinBox non funzionerà qui perché il segnale clicked () di QPushButton ha una firma diversa, e comunque come passerei il valore 20 alla spinbox? Devo scrivere una sorta di funzione ausiliaria per agire come uno slot che chiama spinbox- > setValue (20)? In tal caso, che forma avrebbe?
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();
}
Soluzione
Puoi fare:
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)));
o
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()));
Preferisco la prima opzione perché non richiede che la classe AuxSignals abbia un puntatore a un QWidget specifico.
Altri suggerimenti
Penso che tu stia guardando uno SLOT personalizzato qui. Un segnale QPushButton :: clicked
genererà un evento booleano ( true | false
). Se lo prendi usando QSpinBox :: setValue
non andrai molto lontano. Il QSpinBox :: setValue
si aspetta un int e converte l'input booleano in 0 o 1, come forse il caso e la tua spinbox aumenta di solo 1 unità. Se dovessi scrivere un SLOT
personalizzato puoi effettivamente impostare il valore esatto del dispositivo di scorrimento con un controllo molto maggiore.