qt - 带有信号参数和额外参数的 QSignalMapper

标签 qt arguments signals

我知道 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 个 slider ,它们都有一个类似 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。

最佳答案

QSignalMapper 并不是将参数从信号发送到插槽,而是让信号接收者知道“谁”是谁或使用什么数据。如果您需要知道值和发送者,您可以使用一些内部类映射,或者使用 QObject * 映射器,然后将 QObject * 转换为 slider 。

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

关于qt - 带有信号参数和额外参数的 QSignalMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16578466/

相关文章:

linux - 如何在 Linux 中构建完全静态的 QT 应用程序?

qt - QML语言如何禁用Gridview/Listview的Flickable

python - 如何访问继承类的关键字参数默认值

c - 在条件变量未发出信号时设置 settimer() 和 SIGALRM

audio - 向我解释 FFT

python - 使用文件中的复数进行快速傅里叶变换

qt - 启动连接后将 QTcpSocket 移动到新线程

c++ - 如何为 Viewer 和 QScrollArea 添加垂直分隔符?

c++ - CreateprocessW 截断的命令行参数

Scala- curry 和默认参数