如何在不声明 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 一起使用?