首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带信号参数和额外参数的QSignalMapper

带信号参数和额外参数的QSignalMapper
EN

Stack Overflow用户
提问于 2013-05-16 11:20:57
回答 1查看 3.6K关注 0票数 2

我知道QSignalMapper在这种情况下工作得很好:

代码语言:javascript
复制
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个滑块都有一个像按钮一样的插槽:

代码语言:javascript
复制
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()));

正如您所看到的,这与信号和插槽之间的一致规则相矛盾。这里有什么变通的方法吗?我正在使用Qt4。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-16 15:26:38

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

代码语言:javascript
复制
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);

这里是插槽主体:

代码语言:javascript
复制
void YourClass::SetSlice(QWidget *wgt)
{
    QSlider * slider = qobject_cast<QSlider *>(wgt);

    if(slider) {
        SetSlice(slider->value());
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16578466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档