2009-12-11 2 views
2

안녕 친구,이 프로그램에서 닫기, 최소화 및 기타 이벤트를 잡는 방법 (pyqt)?

여기 문제는 위젯을 숨기려면 QTabWidget의 최소화 및 닫기 이벤트 (기본값으로이 위젯에는 닫기 또는 최소화라는 슬롯이 없음)를 잡아두고 싶습니다. 사용자는 트레이 아이콘 메뉴에서 종료를 클릭하여 응용 프로그램을 종료 할 수 있습니다 ..

from PyQt4 import QtCore, QtGui 
import sys 

class Ui_TabWidget(object): 
    def setupUi(self, TabWidget): 
     TabWidget.setObjectName("TabWidget") 
     TabWidget.resize(400, 300) 
     self.tab = QtGui.QWidget() 
     self.tab.setObjectName("tab") 
     TabWidget.addTab(self.tab, "") 
     self.tab1 = QtGui.QWidget() 
     self.tab1.setObjectName("tab1") 
     TabWidget.addTab(self.tab1, "") 

     self.retranslateUi(TabWidget) 
     QtCore.QMetaObject.connectSlotsByName(TabWidget) 

    def retranslateUi(self, TabWidget): 
     TabWidget.setWindowTitle(QtGui.QApplication.translate("TabWidget", "TabWidget", None, QtGui.QApplication.UnicodeUTF8)) 
     TabWidget.setTabText(TabWidget.indexOf(self.tab), QtGui.QApplication.translate("TabWidget", "Tab 1", None, QtGui.QApplication.UnicodeUTF8)) 
     TabWidget.setTabText(TabWidget.indexOf(self.tab1), QtGui.QApplication.translate("TabWidget", "Tab 2", None, QtGui.QApplication.UnicodeUTF8)) 

class Trayicon(QtGui.QSystemTrayIcon): 
    def __init__(self,parent=None): 
     QtGui.QSystemTrayIcon.__init__(self,parent) 
     self.setIcon(QtGui.QIcon("icons/blockattack32.xpm")) 
     self.show() 

     self.menu=QtGui.QMenu() 

     preference=self.menu.addAction("Preferences") 
     exit=self.menu.addAction("Exit") 

     self.setContextMenu(self.menu) 

     self.TabWidget = QtGui.QTabWidget() 
     ui = Ui_TabWidget() 
     ui.setupUi(self.TabWidget) 

     self.connect(exit,QtCore.SIGNAL('triggered()'),self.menuExit) 

     self.connect(preference,QtCore.SIGNAL('triggered()'),self.showWidget) 


    def menuExit(self): 
     app.exit() 

    def showWidget(self): 
     self.TabWidget.show() 

app = QtGui.QApplication(sys.argv) 
cd=Trayicon() 
cd.show() 
sys.exit(app.exec_()) 

귀하의 도움을 많이 주시면 감사하겠습니다 !!!!! 가능하다면 저에게 Qt의 2 차 레벨 프로그래밍을 가르치는 자습서를 보여줄 수 있습니까?

+0

나는이 질문에 대답하는 것이 자유롭지 않다는 것을 알지 못했습니다! –

답변

2

달성하고자하는 것이 확실하지 않습니다.

해당 클래스의 공용 메소드를 사용하여 탭 위젯을 숨기시겠습니까? 그렇다면 단순히 close() 메소드를 호출하면됩니다.

귀하의 요구 사항은 당신이 쓴 --- 응용 프로그램이 다음이 적용되는 실행중인 탭 위젯을 닫습니다

을 원하지 않는 그런 경우 : 는 "여기서 문제는 내가 잡을 싶어한다 최소화하고 QTabWidget의 close 이벤트 위젯 을 .. 숨길 수 (기본적으로이 위젯 가까이라는 이름의 슬롯이 있거나 최소화하지 않습니다) "

QTabWidget이는 QWidget과는 QWidget 구현 상속 '가까이()'. 위의 코드

class MyTabWidget(QtGui.QtabWidget): 
    def closeEvent(self): 
     # Let the Exit button handle tab closing 
     print "close event captured. Do nothing." 

     # Alternatively, if you want to EXIT the application when the close event 
     #occurs, you can implement that code here! 


# In the TrayIcon class 

self.TabWidget = MyTabWidget() 

:

그래서, QTabWidget을 상속하는 클래스에서, 당신은 당신이 시도 할 수 코드에서 close 이벤트를

을 캡처 "() closeEvent"방법을 구현할 수 있습니다 시스템 트레이의 종료 버튼을 클릭했을 때만 위젯이 닫히게됩니다 (그리고 탭 위젯의 'X'버튼은 해당 위젯을 닫거나 숨기지 않습니다).

1

사용자 고유의 이벤트 필터를 구현할 수 있습니다.

class custom(QWidget): 
    def __init__(self): 
     super(custom, self).__init__() 
     self.installEventFilter(self) 

    def eventFilter(self, qobject, qevent): 
     qtype = qevent.type() 
     if qtype == QEvent.Close or qtype == QEvent.WindowStateChange: 
      .. hide logic 
      return True 
     # parents event handler for all other events 
     return super(custom,self).eventFilter(qobject, qevent)