В Qt как получить нажатие кнопки, чтобы установить спинбокс на определенное значение? - PullRequest
0 голосов
/ 02 мая 2009

Я пытаюсь разобраться с механизмом сигналов и слотов Qt. У меня есть приложение с QPushButton и QSpinBox. Когда я нажимаю кнопку, я хочу, чтобы спинбокс изменился на 20. Какой сигнал и слот мне нужно настроить?

Приведенный ниже код показывает приложение, с которым у меня возникли проблемы с подключением. Насколько я понимаю, слот setValue (int) QSpinBox не будет работать здесь, потому что сигнал clicked () QPushButton имеет другую сигнатуру, и в любом случае, как мне передать значение 20 в спинбокс? Нужно ли писать какую-то вспомогательную функцию, которая будет действовать как слот, который вызывает spinbox-> setValue (20)? Если да, то какую форму это примет?

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

}

Ответы [ 2 ]

3 голосов
/ 02 мая 2009

Вы можете сделать:

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

или

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

Я предпочитаю первый вариант, потому что он не требует, чтобы класс AuxSignals имел указатель на определенный QWidget.

1 голос
/ 02 мая 2009

Я думаю, что вы смотрите на пользовательский слот здесь. Сигнал QPushButton::clicked выдаст логическое (true|false) событие. Если вы поймаете его с помощью QSpinBox::setValue, вы не будете далеко ходить. QSpinBox::setValue ожидает int и преобразует входное логическое значение в 0 или 1, в зависимости от случая, и ваш спинбокс увеличивается только на 1 единицу. Если бы вы написали пользовательский SLOT, вы на самом деле можете установить точное значение ползунка с гораздо большим контролем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...