我怎样才能让动作只在现在被检查时执行?
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.ordered
和 self.random
。我认为这不是您所期望的行为。
相反,您可以有一个 string
值,我们称它为 whatToDoNext
。单击菜单将字符串设置为操作的文本:
def sortedEvent(self,action):
self.whatToDoNext=action.text()
在您的情况下,whatToDoNext
可以是 "ordered"、"random" 或 "replay"。
mediaObject
的 finished
信号总是连接到同一个函数:
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
我在 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.ordered
和 self.random
。我认为这不是您所期望的行为。
相反,您可以有一个 string
值,我们称它为 whatToDoNext
。单击菜单将字符串设置为操作的文本:
def sortedEvent(self,action):
self.whatToDoNext=action.text()
在您的情况下,whatToDoNext
可以是 "ordered"、"random" 或 "replay"。
mediaObject
的 finished
信号总是连接到同一个函数:
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