В Qt, как мне нажать кнопку, чтобы установить spinbox на определенное значение?
-
03-07-2019 - |
Вопрос
Я пытаюсь разобраться с механизмом сигналов и слотов Qt.У меня есть приложение с QPushButton и QSpinBox.Когда я нажимаю на кнопку, я хочу, чтобы значение spinbox изменилось на 20.Какой сигнал и слот мне нужно настроить?
Приведенный ниже код показывает приложение, с функцией подключения у меня возникли проблемы.Насколько я понимаю, слот setValue (int) QSpinBox здесь не будет работать, потому что сигнал clicked () QPushButton имеет другую сигнатуру, и в любом случае, как бы я передал значение 20 в spinbox?Нужно ли мне написать какую-то вспомогательную функцию, которая будет действовать как слот, вызывающий 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();
}
Решение
Вы можете либо сделать:
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.
Другие советы
Я думаю, что вы смотрите на пользовательский слот здесь. Сигнал QPushButton :: clicked
выдаст логическое ( true | false
) событие. Если вы поймаете его с помощью QSpinBox :: setValue
, вы не будете очень далеко ходить. QSpinBox :: setValue
ожидает int и преобразует входное логическое значение в 0 или 1, в зависимости от случая, и ваш спинбокс увеличивается только на 1 единицу. Если бы вы написали пользовательский SLOT
, вы на самом деле можете установить точное значение ползунка с гораздо большим контролем.