En Qt, ¿cómo puedo hacer que se presione un botón para establecer un cuadro de giro en un valor determinado?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy intentando familiarizarme con el mecanismo de señales y ranuras de Qt. Tengo una aplicación con un QPushButton y un QSpinBox. Cuando hago clic en el botón, quiero que la casilla de giro cambie a 20. ¿Qué señal y ranura necesito configurar?

El siguiente código muestra la aplicación, la función de conexión es la que tengo problemas. Como entiendo, la ranura setValue (int) de QSpinBox no funcionará aquí porque la señal de QPushButton pulsada () tiene una firma diferente, y de todos modos, ¿cómo pasaría el valor 20 a la casilla de selección? ¿Necesito escribir algún tipo de función auxiliar para actuar como una ranura que llama spinbox- > setValue (20)? Si es así, ¿qué forma tomaría?

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

}
¿Fue útil?

Solución

Puedes hacerlo:

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

Prefiero la primera opción porque no requiere que la clase AuxSignals tenga un puntero a un QWidget específico.

Otros consejos

Creo que estás viendo un SLOT personalizado aquí. Una señal QPushButton :: pulsada dará un evento booleano ( true | false ). Si lo atrapa usando QSpinBox :: setValue no irá muy lejos. El QSpinBox :: setValue espera un int y convierte el booleano de entrada a 0 o 1 según sea el caso y su casillero de casillas se incrementa en solo 1 unidad. Si escribieras un SLOT personalizado, puedes establecer el valor exacto del control deslizante con mucho más control.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top