在PyQt4中系统提供的模板都是一样的,看起来有点俗。看到360等一些软件界面很好看,所以想着能不能做一个像这样的界面。于是在网找了一些教程,基本都是直接去掉系统自带的菜单栏、状态栏等。下面将我再做过程中的实现做一个记录。
在这里我也只是做了第一步,那就是将主界面的菜单栏去掉并实现拖动。
去掉菜单栏的方法:
只需要在构造函数中加上下面这一句话即可
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
下面我将我的整个工程贴出来,我使用时的pycharm+PyQt4直接生产的.ui文件,再转换成.py文件。所以我的工程是有两个文件
hello.py 文件的内容
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'hello.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(QtGui.QMainWindow):
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.setupUi(self)
self.retranslateUi(self)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "hello", None))
PyQt_Pro.py文件的内容如下:
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import hello
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = hello.Ui_MainWindow()
# form.setWindowTitle("Counters")
MainWindow.show()
app.exec_()
实现后前的界面如下:
实现后的界面如下:
我使用的是win10系统,和win7的有一些区别,在win7看起来效果更明显一些。
那么问题来了,去掉菜单栏后我们无法拖动窗口了。所以借来要做的事就是实现窗口的拖动。
实现窗口的拖动也简单,只需要重构几个鼠标的函数即可:
第一个是mousePressEvent函数
def mousePressEvent(self, event):
self.pressX = event.x() #记录鼠标按下的时候的坐标
self.pressY = event.y()
pressX和pressY需要在类中进行声明
第二个是mouseMoveEvent函数
def mouseMoveEvent(self, event):
x = event.x()
y = event.y() #获取移动后的坐标
moveX = x-self.pressX
moveY = y-self.pressY #计算移动了多少
positionX = self.frameGeometry().x() + moveX
positionY = self.frameGeometry().y() + moveY #计算移动后主窗口在桌面的位置
self.move(positionX, positionY) #移动主窗口
修改后的hello.py文件如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'hello.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(QtGui.QMainWindow):
pressX = pressY = 0
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.setupUi(self)
self.retranslateUi(self)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "hello", None))
def mousePressEvent(self, event):
self.pressX = event.x() #记录鼠标按下的时候的坐标
self.pressY = event.y()
def mouseMoveEvent(self, event):
x = event.x()
y = event.y() #获取移动后的坐标
moveX = x-self.pressX
moveY = y-self.pressY #计算移动了多少
positionX = self.frameGeometry().x() + moveX
positionY = self.frameGeometry().y() + moveY #计算移动后主窗口在桌面的位置
self.move(positionX, positionY) #移动主窗口
PyQt_Pro.py文件的内容不变:
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import hello
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = hello.Ui_MainWindow()
# form.setWindowTitle("Counters")
MainWindow.show()
app.exec_()
这样就实现了拖动了,窗口上看起来还是没有什么变化,所以就不贴图了。