Em Qt como faço para pressionar um botão para definir um campo incremental para um determinado valor?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando se familiarizar com mecanismo de sinal e ranhuras do Qt. Eu tenho um aplicativo com um QPushButton e uma QSpinBox. Quando clico no botão Eu quero o campo incremental para mudar para 20. O sinal e slot que eu preciso configurar?

O código a seguir mostra o aplicativo, a função de ligação é o que eu estou tendo problemas com. Pelo que entendi o setValue (int) Slot de QSpinBox não vai funcionar aqui porque o sinal clicado () de QPushButton tem uma assinatura diferente, e mesmo assim como eu ia passar o valor 20 para o campo incremental? Eu preciso escrever algum tipo de função auxiliar para atuar como um slot que chama spinbox-> setValue (20)? Se assim for, qual a forma levaria?

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

}
Foi útil?

Solução

Você quer pode fazer:

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

Eu prefiro a primeira opção, pois não requer a classe AuxSignals ter um ponteiro para uma específica QWidget.

Outras dicas

Eu acho que você está olhando para um slot personalizado aqui. Um sinal QPushButton::clicked dará um (true|false) evento booleano. Se você pegá-lo usando QSpinBox::setValue você não irá muito longe. O QSpinBox::setValue espera um int e converte a entrada booleana para 0 ou 1 como o caso talvez e seus incrementos SpinBox por apenas 1 unidade. Se você fosse escrever um SLOT personalizado que você pode realmente definir o valor deslizante exata com muito mais controle.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top