首先,我有一个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中进行了说明.