Dans Qt, comment puis-je appuyer sur un bouton pour définir un spinbox à une certaine valeur?

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

  •  03-07-2019
  •  | 
  •  

Question

J'essaie de comprendre le mécanisme de signal et de slots de Qt. J'ai une application avec un QPushButton et un QSpinBox. Lorsque je clique sur le bouton, je souhaite que le spinbox passe à 20. Quel signal et quel emplacement dois-je configurer?

Le code ci-dessous montre l'application, la fonction de connexion est celle avec laquelle j'ai des problèmes. Si je comprends bien, la position setValue (int) de QSpinBox ne fonctionnera pas ici car le signal clicked () de QPushButton a une signature différente, et comment ferais-je passer la valeur 20 au spinbox? Dois-je écrire une sorte de fonction auxiliaire pour jouer le rôle d’emplacement appelant spinbox- > setValue (20)? Si oui, quelle forme cela prendrait-il?

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

}
Était-ce utile?

La solution

Vous pouvez soit faire:

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

ou

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

Je préfère la première option car elle ne nécessite pas que la classe AuxSignals ait un pointeur sur un QWidget spécifique.

Autres conseils

Je pense que vous regardez un SLOT personnalisé ici. Un signal QPushButton :: clicked donnera un événement booléen ( true | false ). Si vous l'attrapez avec QSpinBox :: setValue , vous n'irez pas très loin. Le QSpinBox :: setValue attend un int et convertit le booléen en entrée en 0 ou 1 selon le cas, et votre spinbox n'incrémente que d'une unité. Si vous deviez écrire un SLOT personnalisé, vous pouvez définir la valeur exacte du curseur avec davantage de contrôle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top