5

QSlider を QDoubleSpinBox に接続したいのですが、コードは正常にコンパイルされ、単純な QSpinBox では実行されますが、QDoubleSpinBox では機能しません。

QSlider *horizontalSlider1 = new QSlider();
QDoubleSpinBox *spinBox1 = new QDoubleSpinBox();

connect(spinBox1, SIGNAL(valueChanged(double)),horizontalSlider1,SLOT(setValue(double)) );
connect(horizontalSlider1,SIGNAL(valueChanged(double)),spinBox1,SLOT(setValue(double)) );
4

6 に答える 6

7

引数の型を変換し、信号を送信するか、スライダーを直接更新する独自のスロットを追加する必要があります。

于 2012-01-09T16:54:55.413 に答える
7

QSlider と QDoubleSpinBox はvalueChanged/で異なるタイプの引数を取りsetValueます (もちろん、QSlider は int を使用し、QDoubleSpinBox は double を使用します)。スライダーの信号とスロットの引数の型を変更すると役立つ場合があります。

connect(spinBox1, SIGNAL(valueChanged(double)),horizontalSlider1,SLOT(setValue(int)) );
connect(horizontalSlider1,SIGNAL(valueChanged(int)),spinBox1,SLOT(setValue(double)) );

Qt がこの型変換を自動的に処理できるかどうかはわかりません。そうでない場合は、独自のスロットを定義して、正しいオブジェクトで setValue() を呼び出す必要があります

于 2012-01-09T16:45:38.320 に答える
3

Dave Kilianが答えたように、QSliderの信号とスロットはdoubleを使用しません。また、Qt4はタイプを自動的に変換しません。それらを接続することはできません。したがって、他のアイテムの値を更新する独自の変換スロットを作成する必要があります。

于 2012-01-09T18:31:28.820 に答える
2

これがあなたを助けることを願っています。

#include <QApplication>
#include <QtGui>
#include <QVBoxLayout>
#include <QSlider>
#include <QLabel>

class DoubleSlider : public QSlider {
    Q_OBJECT

public:
    DoubleSlider(QWidget *parent = 0) : QSlider(parent) {
        connect(this, SIGNAL(valueChanged(int)),
            this, SLOT(notifyValueChanged(int)));
    }

signals:
    void doubleValueChanged(double value);

public slots:
    void notifyValueChanged(int value) {
        double doubleValue = value / 10.0;
        emit doubleValueChanged(doubleValue);
    }
};

class Test : public QWidget {
    Q_OBJECT
public:
    Test(QWidget *parent = 0) : QWidget(parent),
        m_slider(new DoubleSlider()),
        m_label(new QLabel())
    {
        m_slider->setOrientation(Qt::Horizontal);
        m_slider->setRange(0, 100);
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(m_slider);
        layout->addWidget(m_label);
        connect(m_slider, SIGNAL(doubleValueChanged(double)),
            this, SLOT(updateLabelValue(double)));
        updateLabelValue(m_slider->value());
    }

public slots:
    void updateLabelValue(double value) {
        m_label->setText(QString::number(value, 'f', 2));
    }

private:
    QSlider *m_slider;
    QLabel *m_label;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Test *wid = new Test();
    wid->show();

    return a.exec();
}

#include "main.moc"
于 2015-02-03T08:29:25.470 に答える
0

この非常によく似た質問には、独自のスロットを作成してシグナルを送信する方法に関するコード例がいくつかあります。

作成したベクターを QDoubleSpinBox と QSlider の範囲として使用する

于 2013-06-25T14:17:52.423 に答える