我怎样才能让动作只在现在被检查时执行?

How can I let action execute only now being checked ?

我在 pushButton_6 中创建了 popmenu
popmenu中有3个action,每个action只能单选。
该动作用于调整歌曲的播放方式。
我有一个问题,触发的动作会被记住。

例如,
歌曲列表:ABCDEFG,正在播放A.
当我在随机操作之前单击有序操作时。
这首歌会先用ordered(song B),然后用random (假设现在随机到E)。
所以它播放歌曲 E .
但是我希望这首歌只是随机播放,因为它现在已经转换为随机状态。

另一个例子,
当我点击有序动作时,然后是随机动作,最后是有序动作。
这首歌将首先使用 ordered(song B) ,然后使用 random (Suppose now randomly to E) ,最后使用 ordered.(song F)
但是我只想用 ordered 播放这首歌,因为它现在已经转换成 ordered 的状态了。
所以这首歌应该播放 B 而不是 F .

我怎样才能让动作只在现在被检查时执行?
对了,popmenu可以显示吗?

弹出菜单代码如下

        popmenu = QtGui.QMenu(self.ui.pushButton_6)
        group = QtGui.QActionGroup(self.ui.pushButton_6)
        group.setExclusive(True)

        for i in range(1, 4):
            if i==1:
                action = group.addAction('ordered')
                action.setCheckable(True)
                #action.setChecked(True) 

            if i==2:
                action = group.addAction('replay')
                action.setCheckable(True)

            if i==3:
                action = group.addAction('random')
                action.setCheckable(True)


            popmenu.addAction(action)
        self.ui.pushButton_6.setMenu(popmenu)
        group.triggered.connect(self.sortedEvent) 

这里是sortedEvent的代码。

def sortedEvent(self,action):       
        if action.text()=="ordered":
            print(action.text())                                    
            self.connect(self.mediaObject,QtCore.SIGNAL('finished()'),self.ordered)

        if action.text()=="replay":
            print(action.text())               
            self.connect(self.mediaObject,QtCore.SIGNAL('aboutToFinish()'),self.replay)

        if action.text()=="random":
            print(action.text())                
            self.connect(self.mediaObject,QtCore.SIGNAL('finished()'),self.random)

connect是相加的,不能相互替代。使用您的代码,如果我单击 "ordered",然后单击 "random",finished 信号将连接到两个插槽:self.orderedself.random。我认为这不是您所期望的行为。

相反,您可以有一个 string 值,我们称它为 whatToDoNext。单击菜单将字符串设置为操作的文本:

def sortedEvent(self,action):       
    self.whatToDoNext=action.text()

在您的情况下,whatToDoNext 可以是 "ordered"、"random" 或 "replay"。
mediaObjectfinished 信号总是连接到同一个函数:

self.mediaObject.finished.connect(self.on_finish)

def on_finish(self):
    if self.whatToDoNext=="ordered":
        #read the next song
    elif self.whatToDoNext=="random":
        #read a random song
    else:
        #replay