1. 程式人生 > >PyQt4隱藏選單欄並實現拖動

PyQt4隱藏選單欄並實現拖動

在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_()

這樣就實現了拖動了,視窗上看起來還是沒有什麼變化,所以就不貼圖了。