【问题标题】:QMenu action creation in a range在一个范围内创建 QMenu 动作
【发布时间】:2015-06-28 11:18:47
【问题描述】:

我会创建一个 qMenu,其中的行包含一个文件名列表。这是一个可变长度列表。我想做一个简单的脚本,我会选择一个 来自它的简单行(文件)。

from PySide import QtGui

def a():
    print "Here i should know which menu is called."


mpos = QtGui.QCursor
x = mpos.pos().x()
y = mpos.pos().y()
# print x,y


app = QtGui.QApplication(())
m = QtGui.QMenu()

for i in range(22):
    m.addAction('Menu '+str(i), a)

m.setGeometry( x-20, y-20, 0, 0)
# m.hideTearOffMenu()
# m.setTitle("hh")

# action1.triggered.connect( a)
m.exec_()

【问题讨论】:

    标签: pyside


    【解决方案1】:

    您需要将来自 每个 动作的信号连接到其自己的 行为。这可以通过 Python 来完成,如下所示:

    def create_callable_for(i):
        def f():
            print("hello",i)
        return f
    
    for i in range(22):
       m.addAction('Menu '+str(i), create_callable_for(i))
    

    但我个人更喜欢这样使用functools.partial

    for i in range(3):
        fileMenu.addAction(a,functools.partial(print,"Hello",i))
    

    为每个菜单项创建一个可调用对象,其中包含(在闭包中)将该操作与菜单中的其他操作区分开来的值。这里是 int i,但它也可以是一个文件名。

    【讨论】:

      【解决方案2】:

      您可以将插槽连接到菜单的triggered 信号,该信号会发送选择的操作:

      def a(action):
          print "Here i should know which menu is called."
          print unicode(action.text())
      
      ...
      
      m.triggered.connect(a)
      

      或者,exec 函数直接返回被选择的动作(或者None,如果没有被选择)。所以你也可以这样做:

      action = m.exec_()
      if action is not None:
          print unicode(action.text())
      else:
          print 'nothing selected'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-31
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 2022-09-23
        相关资源
        最近更新 更多