2014-04-23 6 views
1

activated 슬롯이 실행 중이더라도 메뉴가 여전히 표시되지 않습니다. 트레이 아이콘과 시뮬레이션 된 클릭을 수동으로 클릭하고 동일한 실행 로직을 통해 추적했습니다.QSystemTrayIcon에서 사용자 시뮬레이션 시뮬레이션

은 현재 내가

여기
class MyClass(QObject): 
    def __init__(): 
     self._testSignal.connect(self._test_show) 
     self.myTrayIcon.activated.connect(lambda reason: self._update_menu_and_show(reason)) 

    def show(): 
     self._testSignal.emit() 

    @pyqtSlot() 
    def _test_show(): 
     self._trayIcon.activated.emit(QtWidgets.QSystemTrayIcon.Trigger) 

    @QtCore.pyqtSlot() 
    def _update_menu_and_show(reason): 
     if reason in (QtWidgets.QSystemTrayIcon.Trigger): 
     mySystemTrayIcon._update_menu() 

... 
class MySystemTrayIcon(QSystemTrayIcon): 

    def _update_menu(self): 
     # logic to populate menu 
     self.setContextMenu(menu) 
... 
MyClass().show() 
+1

입니다. PyQt v4에 대한 빠른 테스트를 완료 했으므로 제대로 작동하는 것 같습니다 (예 : http://pastebin.com/). NkAQQyqt). 내가 한 것에 대해 다른 것을 보지 못하거나 PyQt5에 코드를 포팅해도 여전히 문제가 발생하면 PyQt5의 버그 일 수있다. –

+0

@ three_pineapples 스크립트를 사용하면 설정에 문제가 있음을 알 수있었습니다. 이제 메뉴가 나타나지 않는 문제가 있습니다. 수정 사항을 참조하십시오. – mingxiao

+0

@mingxiao 기술적으로 현재 다른 문제를보고 있으므로 더 이상 관련이없는 질문의 초기 부분을 삭제하십시오. SO는 토론 스레드가 아니므로 Q & A 포럼입니다. 질문은 독특하고 잘 정의되어 있어야하며, 그 질문과 대답은 상호 연관되어 있어야합니다. – Schollii

답변

1

내가 트레이 아이콘에 연결된 컨텍스트 메뉴 당신이 지금 상황에 맞는 메뉴에서 WindowStaysOnTopHint을 설정해야 할 것 같다

class MyClass(QObject): 
    def __init__(): 
     self._testSignal.connect(self._test_show) 
     self.myTrayIcon.activated.connect(lambda reason: self._update_menu_and_show(reason)) 

    def show(): 
     self._testSignal.emit() 

    @pyqtSlot() 
    def _test_show(): 
     self._trayIcon.activated.emit(QSystemTrayIcon.Context) 

    @QtCore.pyqtSlot() 
    def _update_menu_and_show(reason): 
     if reason in (QSystemTrayIcon.Trigger, QSystemTrayIcon.Context): 
      mySystemTrayIcon._update_menu() 
      # Trigger means user initiated, Context used for simulated 
      # if simulated seems like we have to tell the window to explicitly show 

      if reason == QSystemTrayIcon.Context: 
       mySystemTrayIcon.contextMenu().setWindowFlags(QtCore.Qt.WindowStaysOnTopHint|QtCore.Qt.FramelessWindowHint) 
       pos = mySystemTrayIcon.geometry().bottomLeft() 
       mySystemTrayIcon.contextMenu().move(pos) 
       mySystemTrayIcon.contextMenu().show() 

... 
class MySystemTrayIcon(QSystemTrayIcon): 

    def _update_menu(self): 
     # logic to populate menu 
     self.setContextMenu(menu) 
... 
MyClass().show() 

팝업 만든 어떻게해야 나타납니다. 이 솔루션은 작업 표시 줄이 맨 위에 있다고 가정하므로 mac에만 해당됩니다.

한 가지 부작용은 사용자가 다른 곳을 클릭하더라도 상황에 맞는 메뉴가 항상 위에 있다는 것입니다. 컨텍스트 메뉴에 이벤트 필터를 두었습니다. 등록 된 유용한 이벤트는 QEvent.Leave