在 Qt/C++ 中,有没有办法将按钮单击事件列表连接到一个插槽?

Posted

技术标签:

【中文标题】在 Qt/C++ 中,有没有办法将按钮单击事件列表连接到一个插槽?【英文标题】:In Qt/C++, is there a way to connect a list of button click events to one slot? 【发布时间】:2015-10-02 06:05:16 【问题描述】:

在 Qt/C++ 中,我有一系列按钮,我想通过单个事件处理程序运行它们以进行单击,并知道单击了哪个按钮。

有没有办法将按钮单击事件列表连接到一个插槽?例如,我创建了一个QList<QPushButton *>,然后使用单个connect() 语句来处理此列表的&QPushButton::clicked 信号,并将其映射到单个SLOT(onButtonClicked(QWidget *))

那里有关键字——单。当然,我可以迭代一个列表,但我想知道是否有一种方法可以在列表迭代之外只有一个 connect() 语句。

换句话说,我想知道是否已经有一种我可能没有意识到的有效方法来执行此操作,而不是我迭代QPushButtonQList。这只是高效和整洁的问题。

【问题讨论】:

你有一个例子here。 @Tarod 不完全是。我一直在寻找一种在迭代之外而不是在迭代内部的更整洁的方式。就像以某种方式将整个按钮列表传递给 connect() 调用而无需迭代。 我认为没有这种方法。您将始终必须通过信号映射器或直接与插槽建立每个按钮的单独连接。 您可以创建 1 个不带任何参数的插槽,并在内部使用 sender() 方法 + qobject_cast 【参考方案1】:

处理此问题的最佳方法可能是使用QButtonGroup。如果您坚持使用自己的列表或可能有不同的小部件或信号,您仍然可以使用QSignalMapper

http://doc.qt.io/qt-5/qbuttongroup.html

http://doc.qt.io/qt-5/qsignalmapper.html

【讨论】:

以上是关于在 Qt/C++ 中,有没有办法将按钮单击事件列表连接到一个插槽?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 清除按钮单击事件的下拉列表值?

javafx:如何将Enter键绑定到按钮并在单击时触发事件?

使用 c# 在数据列表中的按钮单击事件上未触发 Itemcommand

如何在android中的活动开始时禁用按钮的单击事件检查

抑制触发的 Blazor 输入事件

WPF 文本框没有单击事件吗?如果想用单击事件怎么处理