PyQt4隱藏選單欄並實現拖動
阿新 • • 發佈:2019-02-13
在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_()
這樣就實現了拖動了,視窗上看起來還是沒有什麼變化,所以就不貼圖了。