In Qt come faccio a premere un pulsante per impostare una casella di selezione su un determinato valore?

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

  •  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();

}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top