我正在使用python3和pyqt4。我想创建一个带有操作的菜单,该菜单的数量根据数组而不同。我希望他们每个人都将保存在数组中的相应信息保存到一个变量中。创建可变数量的事件似乎是不可能的。那么,如何根据其激活的动作来创建一个不同工作的事件呢?那是我的代码:
def buildLoadSettings(self):
self.settings = array
for i in range(len(self.settings)):
exec("self.settings" + str(i) + " = QtGui.QAction('" + self.settings[i][0] + "', self)")
exec("self.loadMenu.addAction(self.settings" + str(i) + ")")
我想将每个动作与事件联系起来,最后将" self.set.ssting [i] [1]"保存到变量"设置"。对不起,我的新手问题。
尚不完全清楚您要实现的目标,但是有几种API可以帮助您。当然,当然不需要像目前那样使用丑陋的exec
电话。
这里有一些想法:
-
使用
QAction.setData()
将某些数据与每个动作相关联:for item in self.settings: action = QtWidgets.QAction(item[0], self) action.setData(item[1]) self.loadMenu.addAction(action)
-
使用
QMenu.actions()
访问操作,而不是创建属性:action = self.loadMenu.actions()[2] print((action.text(), action.data()))
-
将插槽连接到
QMenu.triggered()
,以在一个地方处理其所有操作:self.loadMenu.triggered.connect(self.handleLoadMenu) def handleLoadMenu(self, action): # "action" is the action that was clicked text = action.text() data = action.data() print('Action Clicked: ("%s", %s)' % (text, data))
ps:
如果要动态获取/设置属性,请使用getattr
和setattr
:
# self.settings2 = action
setattr(self, "settings%s" % 2, action)
# action = self.settings2
action = getattr(self, "settings%s" % 2)