gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:14:03 24 4
gpt4 key购买 nike

我有一个自定义 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com