【发布时间】:2017-07-27 16:39:54
【问题描述】:
编辑:我已阅读 Passing and argument to a slot 它很有帮助,但没有解决我通过信号槽将多个引用传递给我调用的函数的问题。
我目前正在开发一个本质上是单位转换器的 Qt 应用程序。我正在使用 QDoubleSpinBoxes 作为输入和输出来实现它。我遇到了一个我正在寻求帮助的问题。实现的想法是,用户将输入他们想要转换的任何值,当用户失去对旋转框的关注或按下回车键时,它将用答案填充其他单元类型框。
这是我目前的做法:
// creates a custom spinbox for each option
modifiedSpinbox *FahrenheitDblSpinbox = new modifiedSpinbox();
modifiedSpinbox *CelciusDblSpinbox = new modifiedSpinbox();
modifiedSpinbox *KelvinDblSpinbox = new modifiedSpinbox();
modifiedSpinbox *RankineDblSpinbox = new modifiedSpinbox();
// Creates a signal mapper that allows passing of a parameter
// to the convert functions anytime a number is entered
QSignalMapper *tempMapper = new QSignalMapper(this);
// Connects the spinbox editing complete signal with the mapper
connect(tempMapper, SIGNAL(mapped(int)),
this,SLOT(on_userInput(int whoSignaled)));
// Connects the mapper with the function that calls the convert class
connect(FahrenheitDblSpinbox, SIGNAL(editingFinished()),
tempMapper, SLOT(map()));
tempMapper->setMapping(FahrenheitDblSpinbox, 1);
我想实现这个转换函数的方式是,在用户完成他们对旋转框的输入后,让代码发送一个信号 (editingFinished()) 到一个插槽函数,该函数调用一个具有所需功能的 converttools 类进行实际转换。我遇到的问题是我无法弄清楚如何将这些 spinbox 对象的引用传递给我的 converttools 类,以便我可以直接设置 spinbox 值。 我最接近的是使用 QSignalMapper(如上所示)将 single int 或 Qwidget 传递给我的插槽函数,而不是我想要的对象。
我想要一些关于如何在发出信号后将多个引用传递给我的自定义类的建议。我在这里查看了很多问题,但似乎仍然无法弄清楚如何做到这一点或我没有看到更好的方法。
谢谢!
【问题讨论】:
-
你应该更喜欢new signal/slot syntax。
-
@KubaOber 如果您建议使用 lambda 解决方案...那将是一个痛苦的解决方案,总共需要编写 12 个 lambda 连接:(
-
我已经看过那个页面我的应该是重复的,我不同意。 QSignalMapper(据我所知)的问题在于它只允许您传递一个 int、QWdiget 或 QObject。据我所知,我不能使用它传递一个 doublespinbox,即使可以,我也需要为每个函数调用传递多个引用,而不仅仅是一个。也许这不是实现我正在尝试做的事情的最佳方式,但这是我能想到的唯一方式。
-
我很抱歉,我的代码有点混乱,因为它显示我试图传递一个我想要做的部分 int。我正在玩弄我发布的代码。
-
@spartan228 我同意这不是重复的。你最好的选择不是
QSignalMapper,因为你的信号必须是无参数的。相反,您将需要编写自己的 QObject,它接受映射 lambdas 并将它们与对象方法相关联。
标签: qt signals-slots