1

私は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]」を変数「settings」に保存したいと思います。私の初心者の質問で申し訳ありません。

4

1 に答える 1

1

何を達成しようとしているのかは完全には明らかではありませんが、役立つはずの API がいくつかあります。exec現在のように醜い呼び出しを使用する必要はありません。

ここにいくつかのアイデアがあります:

  1. QAction.setData()一部のデータを各アクションに関連付けるために使用します。

        for item in self.settings:
            action = QtWidgets.QAction(item[0], self)
            action.setData(item[1])
            self.loadMenu.addAction(action)
    
  2. QMenu.actions()属性を作成するのではなく、アクションにアクセスするために使用します。

        action = self.loadMenu.actions()[2]
        print((action.text(), action.data()))
    
  3. スロットをQMenu.triggered()に接続して、すべてのアクションを 1 か所で処理します。

        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:

属性を動的に取得/設定する場合は、 and を使用getattrsetattrます。

    # self.settings2 = action
    setattr(self, "settings%s" % 2, action)
    # action = self.settings2
    action = getattr(self, "settings%s" % 2) 
于 2016-11-29T00:27:22.847 に答える