PyQt4——实现窗口拖动

接着前面的隐藏标题栏之后,我们可以自制关闭按钮,最大化按钮和最小化按钮,但是有一个功能可能我们没有办法很直接的实现

就是有标题栏的时候,程序可以直接通过鼠标拖动来改变位置。

现在没有标题栏了,怎么样才能实现拖动窗口来改变位置呢?

经过查阅 PyQt 官方文档,发现 QMainWndow 是继承 QWidget 类的

http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html

而 QWidget 里面有几个默认的监听方法,譬如:

那么按照面向对象的思想来说,我们只需重写这些方法,就可以达到我们需要的效果

下面就通过重写 mousePressEvent 和 mouseMoveEvent 来实现窗口的拖动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys
from PyQt4.QtGui import *
from PyQt4.Qt import *
from PyQt4.QtCore import *

class AboutUsDialog(QDialog):
def __init__(self):
super(AboutUsDialog,self).__init__()
self.setWindowFlags(Qt.FramelessWindowHint|Qt.Dialog)

def mousePressEvent(self, e):
if e.button()==Qt.LeftButton:
self.move1=e.globalPos()-self.frameGeometry().topLeft()
QApplication.postEvent(self,QEvent(174))
e.accept()

def mouseMoveEvent(self, e):
if e.buttons()==Qt.LeftButton:
self.move(e.globalPos()-self.move1)
e.accept()


app = QApplication(sys.argv)
aboutus = AboutUsDialog()
aboutus.show()
sys.exit(app.exec_())

这个方法在 QMainWindow 下也是适用的,因为 QMainWindow 和 QDialog 都是继承自 QWidget 的类