2015-07-20 2 views
0

Я создаю popmenu в pushButton_6.
В попменю есть три действия, и каждое действие может только радио.
Действие используется для настройки воспроизведения песни.
У меня возникла проблема, вызвавшая действие, будет запомнена.
Как я могу разрешить действие выполнять только сейчас, когда проверяется?

Например,
Список композиций: ABCDEFG, и теперь играет A.
, когда я нажимаю упорядоченное действие перед случайным действием.
Песня сначала будет упорядочена (песня B), затем со случайным (предположим теперь случайным образом к E).
Итак, он играет песню E.
Но я хочу, чтобы песня просто играла со случайным, потому что теперь она превратилась в состояние случайного.

Другой пример:
, когда я нажимаю упорядоченное действие, затем случайное действие и, наконец, упорядоченное действие.
Песня будет сначала с заказом (песня B), затем со случайным (предположим теперь случайным образом к E) и, наконец, с упорядоченным. (Песня F)
Но я хочу, чтобы песня просто играла с упорядоченным, потому что теперь она преобразуется в состояние упорядоченного.
Итак, песня должна играть 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) 
+0

Как правило, если условия эксклюзивны - 'group.setExclusive (истина)', то вы должны использовать 'еще if' условное заявления. Тем не менее, я все еще ищу подходящее решение. –

+0

Чтобы отобразить всплывающее меню с помощью мыши, 'QMenu.exec (QCursor.pos())'. – Mel

ответ

0

connect являются аддитивными, они не заменяют друг друга. С вашим кодом, если я нажму «упорядоченный», то «случайный», сигнал finished будет подключен к двум слотам: self.ordered и self.random. Я не думаю, что это поведение, которого вы ожидаете.

Вместо этого вы могли бы иметь значение string, назовем его whatToDoNext. Щелчок по меню установите строку текста для данного действия:

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

В вашем случае, whatToDoNext может быть «заказать», «случайный» или «воспроизведение».
finished сигнал mediaObject всегда подключен к одной и той же функции:

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 
+0

Я сделал в соответствии с тем, что вы говорите. Но когда я нажимаю «заказывать», порядок песен ошибочен. Он воспроизводит следующую песню в первый раз, а затем играет следующую третья песня, а затем играет следующую девятую песню. –

+0

Я думаю, что это связано с тем, что вы написали в '#read the next song' – Mel

+0

Но я обнаружил, что такая же ситуация также произошла« случайная ». Я попытался использовать «print (path)», и программа будет выполнена один раз, а затем три раза, наконец, исполняется ночное время. –

Смежные вопросы