Qtでは、ボタンを押してスピンボックスを特定の値に設定するにはどうすればよいですか?
-
03-07-2019 - |
質問
Qtのシグナルとスロットのメカニズムを理解しようとしています。 QPushButtonとQSpinBoxを備えたアプリがあります。ボタンをクリックすると、スピンボックスを20に変更します。どの信号とスロットを設定する必要がありますか?
以下のコードはアプリを示しています。接続機能が問題を抱えています。 QPushButtonのclicked()信号には異なるシグネチャがあるため、QSpinBoxのsetValue(int)スロットはここでは機能しませんが、とにかく値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();
}
解決
次のいずれかを実行できます。
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へのポインタを必要としないため、最初のオプションを好みます。
他のヒント
ここでカスタムSLOTを見ていると思います。 QPushButton :: clicked
シグナルはブール( true | false
)イベントを発生させます。 QSpinBox :: setValue
を使用してそれをキャッチした場合、それほど遠くに行くことはありません。 QSpinBox :: setValue
はintを想定し、場合によっては入力ブール値を0または1に変換し、スピンボックスは1単位だけ増加します。カスタムの SLOT
を作成する場合、実際にスライダーの値をより詳細に設定できます。
所属していません StackOverflow