PySide無邊框視窗跟拖拉

有些UI介面是沒有外面邊框的
在PySide中也可以做到
但少了邊框就無法拖拉移動視窗了
所以要自己寫
除了有無法拖拉移動視窗外
也要自己寫個元件可以最小化視窗、最大化以及關閉事件

首先我先用designer畫出一個視窗
裡面包含了最小化及關閉按鈕
並用pyside-uic 轉成.py檔

在main.py中import進來
設置成無邊框很簡單
只需要 self.setWindowFlags(Qt.FramelessWindowHint) 這行就可以了
最小化及關閉視窗事件,寫函式就可以達成,這裡用到的技巧是lambda

拖拉視窗就比較麻煩了,需重寫mousePressEvent() 跟 mouseMoveEvent()事件

# -*- coding: utf-8 -*-
import sys
from PySide.QtGui import *
from PySide.QtCore import *
import dragui

class MainWindow(QMainWindow, dragui.Ui_MainWindow):
    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.setWindowFlags(Qt.FramelessWindowHint)
        
        # 設定關閉鍵
        self.pushButton.clicked.connect(lambda: self.close())
        # 設定最小化鍵
        self.pushButton_2.clicked.connect(lambda: self.showMinimized())

    def mousePressEvent(self, event):
        # 定義滑鼠點擊事件
        # 在此處我就已經定義拖拉的區域了,在區域內才會接受事件
        if event.buttons() == Qt.LeftButton and \
           self.frameGeometry().topLeft().y() < event.globalPos().y() < self.frameGeometry().topLeft().y() + 50:
            self.dragPosition = event.globalPos() - self.frameGeometry().topLeft()
            self.isinrect = True
            event.accept()
        else:
            self.isinrect = False
            event.ignore()

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton and self.isinrect:
            self.move(event.globalPos()-self.dragPosition)
            event.accept()
            

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

結果如圖:
可以看到中間無邊框的視窗
並且只有上面的區域可以拖拉視窗
其他區域並不能

沒有留言:

張貼留言

About

努力在程式的大海
用力的揮動雙手
找出屬於自己的航線

Blog Archive

Traffic