首先,我有一个QWidget的列表,我不知道直到运行时的长度.然后我创建一个QListWidget,我在其中显示它们,当有人点击它时,我使用signalItemChanged(QListWidgetItem *,QListWidgetItem *)信号来捕获它并获取点击的项目的索引.
现在我想在QMenu中做类似的事情.当我的QMenu和它的动作被建立时,我会知道这个列表,但是我将无法硬编码.
如何创建动作,捕捉他们的信号并将它们连接到同一个插槽,根据操作的菜单列表中的位置(索引)不同而不同.必须有一些方法来解决这个问题,因为其他应用程序使用它.我试图看映射,但是我不知道如何使用它.
我试图在插槽中抓住发件人,但无法从中获取任何有用的信息.
解决方法
您可以使用QAction :: setData创建一个索引(或任何其他数据)到每个动作,并将QMenu :: triggered(QAction *)信号连接到您的插槽.
然后,您可以通过插槽参数的QAction :: data()函数检索数据.
- MyClass::MyClass() {
- // menu creation
- for(...) {
- QAction *action = ...;
- action->setData(10);
- ...
- menu->addAction(action);
- }
- // only one single signal connection
- connect(menu,SIGNAL(triggered(QAction*)),this,SLOT(mySlot(QAction*)));
- }
- void MyClass::mySlot(QAction *action) {
- int value = action->data().toInt();
- }
其他方法:信号映射或使用sender(),在that article of Qt Quaterly中进行了说明.