我正在使用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.settings [i] [1]"变量"设置"。 对不起我的新手问题。
答案 0 :(得分: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)