如何在不声明 32 个插槽的情况下将 32 个按钮的 press() 信号连接到单个函数?

Posted

技术标签:

【中文标题】如何在不声明 32 个插槽的情况下将 32 个按钮的 press() 信号连接到单个函数?【英文标题】:How can I connect the pressed() signal of 32 buttons to a single function without declaring 32 slots? 【发布时间】:2009-11-26 01:56:09 【问题描述】:

我有一个小部件,里面有 32 个按钮。我需要将每个按钮的pressed() 信号连接到一个插槽,以便调用一个函数,该函数的参数取决于我按下的按钮。现在我通过以 on_QPushButtonName_pressed() 的形式添加 32 个插槽来做到这一点 但那是很多插槽。我想知道是否有另一种更小的方法可以做到这一点。我做了类似的事情,但我正在使用自定义小部件,所以我可以在我的类的代码中创建一个新信号,但我想避免为单个按钮创建自定义小部件。

【问题讨论】:

【参考方案1】:

使用 QSignalMapper 类。文档 - http://doc.qt.io/qt-5/qsignalmapper.html - 有一个非常接近您想要的示例。

【讨论】:

【参考方案2】:

另一种可能性:只创建一个插槽,调用sender() 并打开结果。

正如 Rohan 所提到的,QSignalMapper 是推荐的解决方案,因为 sender() 有点小技巧。它的优点是更容易使用。

【讨论】:

QSignalMapper 是围绕 sender 构建的,所以如果你使用它,你可以确定 Qt 开发人员会在 sender 改变行为时考虑到它。 sender()far 更好的解决方案。 QSignalMapper 过于复杂,并为此用例添加了零功能。在对话框中,首先是QObject *qo=sender();,然后是switch(qo)if (qo==my_widget)

以上是关于如何在不声明 32 个插槽的情况下将 32 个按钮的 press() 信号连接到单个函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不包含主机环境的站点包文件夹的情况下将 pywin32 与 virtualenv 一起使用?

如何在不破坏滚动功能的情况下将 UIImage 添加到 UIScrollView?

如何在不使用不安全代码的情况下将float转换为二进制?

如何在不打开的情况下将数据发送到另一个活动

如何在不采用其中更改的情况下将 git 分支声明为合并?

如何在不使用助手编辑器的情况下将 IBOutlet 和 IBAction 连接到视图控制器