2

QSignalMapper が次のような条件でうまく機能することはわかっていました。

QSignalMapper *signalMapper = new QSignalMapper(this);
connect(signalMapper, SIGNAL(mapped(int)), this, SIGNAL(SetSlice(int)));

connect(this->ui->button_1, SIGNAL(slicked()), signalMapper, SLOT(map()));
connect(this->ui->button_2, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(this->ui->button_3, SIGNAL(clicked()), signalMapper, SLOT(map()));

今私は 3 つのスライダーを実装したいと思います。すべて 1 つの SLOT のようなボタンがあります。

QSignalMapper *signalMapper = new QSignalMapper(this);
connect(signalMapper, SIGNAL(mapped(int)), this, SIGNAL(SetSlice(int)));

connect(this->ui->verticalSlider_1, SIGNAL(valueChanged(int)), signalMapper, SLOT(map()));
connect(this->ui->verticalSlider_2, SIGNAL(valueChanged(int)), signalMapper, SLOT(map()));
connect(this->ui->verticalSlider_3, SIGNAL(valueChanged(int)), signalMapper, SLOT(map()));

ご覧のとおり、これは SIGNAL と SLOT の間の一貫したルールと矛盾しています。ここに回避策はありますか?Qt4を使用しています。

4

1 に答える 1

3

QSignalMapperシグナルからスロットに引数を送信することではなく、シグナル受信者にそれが「誰」であるか、またはどのデータが使用されているかを知らせることです。値と送信者の両方を知る必要がある場合は、内部クラス マッピングを使用するか、マッパーを使用してからスライダーQObject *にキャストできます。QObject *

QSignalMapper * mapper = new QSignalMapper(this);
connect(mapper, SIGNAL(map(QWidget *)), this, SLOT(SetSlice(QWidget *)));

mapper->setMapping(this->ui->verticalSlider_1, this->ui->verticalSlider_1);
mapper->setMapping(this->ui->verticalSlider_2, this->ui->verticalSlider_2);
mapper->setMapping(this->ui->verticalSlider_3, this->ui->verticalSlider_3);

そして、ここにスロット本体があります:

void YourClass::SetSlice(QWidget *wgt)
{
    QSlider * slider = qobject_cast<QSlider *>(wgt);

    if(slider) {
        SetSlice(slider->value());
    }
}
于 2013-05-16T07:26:38.377 に答える