我正在開發(fā)一個Qt應用程序并用這種方式改變了closeEvent virtual function的關(guān)閉行為:
class MainWindow(QMainWindow):
def closeEvent(self, event):
event.ignore()
self.hide()
self.trayicon.showMessage('Running', 'Running in the background.')
這按預期工作.如果我刪除event.ignore()應用程序按預期退出,一切都很好.
我也想控制最小化事件,所以當用戶點擊標題欄上的最小化按鈕時,我想移動窗口而不是最小化. 我無法使用hideEvent 虛函數(shù),因為無論如何事件都會被發(fā)送到窗口,所以這段代碼:
def hideEvent(self, event):
event.ignore()
self.move(0,0)
將窗口移動到左上角然后將其最小化. event.ignore()在這里沒有效果,所以我嘗試用這種方式使用QtCore.QObject.event :
def event(self, event):
if event.type() == QEvent.WindowStateChange:
if self.isMinimized():
event.ignore()
self.move(0,0)
return True
return False
窗口移動但最小化.這有什么問題?如何完全覆蓋最小化事件? 解決方法: 嘗試changeEvent 并過濾WindowMinimized 事件,如下所示:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from PyQt4 import QtGui, QtCore
class MyWindow(QtGui.QWidget):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.systemTrayIcon = QtGui.QSystemTrayIcon(self)
self.systemTrayIcon.setIcon(QtGui.QIcon.fromTheme("face-smile"))
self.systemTrayIcon.setVisible(True)
self.systemTrayIcon.activated.connect(self.on_systemTrayIcon_activated)
self.label = QtGui.QLabel(self)
self.label.setText("Minimize me!")
self.layoutVertical = QtGui.QVBoxLayout(self)
self.layoutVertical.addWidget(self.label)
@QtCore.pyqtSlot(QtGui.QSystemTrayIcon.ActivationReason)
def on_systemTrayIcon_activated(self, reason):
if reason == QtGui.QSystemTrayIcon.DoubleClick:
if self.isHidden():
self.show()
else:
self.hide()
def changeEvent(self, event):
if event.type() == QtCore.QEvent.WindowStateChange:
if self.windowState() & QtCore.Qt.WindowMinimized:
event.ignore()
self.close()
return
super(MyWindow, self).changeEvent(event)
def closeEvent(self, event):
event.ignore()
self.hide()
self.systemTrayIcon.showMessage('Running', 'Running in the background.')
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MyWindow()
main.show()
sys.exit(app.exec_())
來源:http://www./content-4-199401.html
|