c++ - 使用多个 slider 在自定义 QWidget 中映射 QSlider::valueChanged 信号

标签 c++ qt qwidget modularity qslider

我有一个自定义 QDialog,上面有一组自定义 slider (即,每个 QWidget 都由一个 slider 和一个关联的标签组成)。本质上,此对话框用于通过调整每个维度的 slider 来更改 3D 场景中对象的坐标。

目前,QDialog 本身存储了一个指向它修改的场景对象的指针。因此,当 slider 发出 valueChanged 时负责对象移动的插槽也是 QDialog 类的一部分。由于它无法知道移动了哪个 slider ,因此移动函数(相当低效)只是循环遍历对话框中的所有 slider ,收集它们的值,并将新配置分配给 3D 对象。

理想情况下,当 slider 移动时,只有更改的维度才需要重新分配。所以我尝试使用 QSignalMapper 来识别每个带有数字索引的 slider 。这需要能够发送带有两个参数的 valueChanged 信号:一个用于标识发送者 slider ,一个用于提供新值本身。不幸的是,据我了解here , QSignalMapper 做不到这一点。

获得我想要的功能的另一种方法可能是使用 sender() 方法。但是,根据文档,这是不好的做法——它违反了模块化原则。

我可以想到其他几个解决方案:允许自定义 slider 类存储其父对话框(看起来很糟糕,因为 sender() 很糟糕),或者甚至可以存储可移动对象本身作为自定义 slider 类的静态成员,而不是(非静态/现在)在整个对话框中。

以下哪一种方法(如果有的话)是到达此处的最佳方法?我应该考虑哪些替代方案?

最佳答案

可能的解决方案是连接 QSlider 信号 sliderReleased(),当用户用鼠标释放 slider 时发出,使用 QSignalMapper map() 并存储带有指针的 slider ID一些 list 。当值挂起时,QDialog 可以发出另一个信号,其中包含 slider ID 和新值的信息。

QSignalMapper *mapper = new QSignalMapper(this);

connect(slider_0, SIGNAL(sliderReleased()), mapper, SLOT(map()));
mapper->setMapping(slider_0, 0);
tab_s[0] = slider_0;
connect(slider_1, SIGNAL(sliderReleased()), mapper, SLOT(map()));
mapper->setMapping(slider_1, 1);
tab_s[1] = slider_1;
connect(slider_2, SIGNAL(sliderReleased()), mapper, SLOT(map()));
mapper->setMapping(slider_2, 2);
tab_s[2] = slider_2;


connect(mapper, SIGNAL(mapped(int)),
        this, SLOT(checkSlider(int)));

在某个位置:

void SomeDialog::checkSlider(int id)
{
    emit valueChanged(id, tab_s[id]->value());
}

关于c++ - 使用多个 slider 在自定义 QWidget 中映射 QSlider::valueChanged 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19099641/

相关文章:

c++ - 线程管理和与 boost::thread 的并行性

c# - 选择合适的 IDE

c++ - 使用 QMediaPlayer 播放自定义流

c++ - 让 QtConcurrent 中的 QTimer 正常工作

qt - 使自定义 QWidget 可选

c++ - 如何使用 QPainter 在 QMainWindow 中的一组小部件中的特定小部件上绘制?

c++ - 为什么我的角落小部件没有显示在 QTabWidget 中?

c++ - 如何通过 int-descriptor 找出文件名? (或 "can I..?")

C++:定义多个构造函数时的对象创建/销毁顺序

file - 无法使用 QDir::rename() 重命名 Qt 中的文件