亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyQt5如何實現無邊框窗口的標題拖動和窗口縮放

發布時間:2021-06-28 10:32:33 來源:億速云 閱讀:485 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“PyQt5如何實現無邊框窗口的標題拖動和窗口縮放”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“PyQt5如何實現無邊框窗口的標題拖動和窗口縮放”這篇文章吧。

py文件

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QVBoxLayout
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QFont, QCursor

class QTitleLabel(QLabel):
  """
  新建標題欄標簽類
  """
  def __init__(self, *args):
    super(QTitleLabel, self).__init__(*args)
    self.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
    self.setFixedHeight(30)

class QTitleButton(QPushButton):
  """
  新建標題欄按鈕類
  """
  def __init__(self, *args):
    super(QTitleButton, self).__init__(*args)
    self.setFont(QFont("Webdings")) # 特殊字體以不借助圖片實現最小化最大化和關閉按鈕
    self.setFixedWidth(40)

class QUnFrameWindow(QWidget):
  """
  無邊框窗口類
  """
  def __init__(self):
    super(QUnFrameWindow, self).__init__(None, Qt.FramelessWindowHint) # 設置為頂級窗口,無邊框
    self._padding = 5 # 設置邊界寬度為5
    self.initTitleLabel() # 安放標題欄標簽
    self.setWindowTitle = self._setTitleText(self.setWindowTitle) # 用裝飾器將設置WindowTitle名字函數共享到標題欄標簽上
    self.setWindowTitle("UnFrameWindow")
    self.initLayout() # 設置框架布局
    self.setMinimumWidth(250)
    self.setMouseTracking(True) # 設置widget鼠標跟蹤
    self.initDrag() # 設置鼠標跟蹤判斷默認值

  def initDrag(self):
    # 設置鼠標跟蹤判斷扳機默認值
    self._move_drag = False
    self._corner_drag = False
    self._bottom_drag = False
    self._right_drag = False

  def initTitleLabel(self):
    # 安放標題欄標簽
    self._TitleLabel = QTitleLabel(self)
    self._TitleLabel.setMouseTracking(True) # 設置標題欄標簽鼠標跟蹤(如不設,則標題欄內在widget上層,無法實現跟蹤)
    self._TitleLabel.setIndent(10) # 設置標題欄文本縮進
    self._TitleLabel.move(0, 0) # 標題欄安放到左上角

  def initLayout(self):
    # 設置框架布局
    self._MainLayout = QVBoxLayout()
    self._MainLayout.setSpacing(0)
    self._MainLayout.addWidget(QLabel(), Qt.AlignLeft) # 頂一個QLabel在豎放框架第一行,以免正常內容擠占到標題范圍里
    self._MainLayout.addStretch()
    self.setLayout(self._MainLayout)

  def addLayout(self, QLayout):
    # 給widget定義一個addLayout函數,以實現往豎放框架的正確內容區內嵌套Layout框架
    self._MainLayout.addLayout(QLayout)

  def _setTitleText(self, func):
    # 設置標題欄標簽的裝飾器函數
    def wrapper(*args):
      self._TitleLabel.setText(*args)
      return func(*args)
    return wrapper

  def setTitleAlignment(self, alignment):
    # 給widget定義一個setTitleAlignment函數,以實現標題欄標簽的對齊方式設定
    self._TitleLabel.setAlignment(alignment | Qt.AlignVCenter)

  def setCloseButton(self, bool):
    # 給widget定義一個setCloseButton函數,為True時設置一個關閉按鈕
    if bool == True:
      self._CloseButton = QTitleButton(b'\xef\x81\xb2'.decode("utf-8"), self)
      self._CloseButton.setObjectName("CloseButton") # 設置按鈕的ObjectName以在qss樣式表內定義不同的按鈕樣式
      self._CloseButton.setToolTip("關閉窗口")
      self._CloseButton.setMouseTracking(True) # 設置按鈕鼠標跟蹤(如不設,則按鈕在widget上層,無法實現跟蹤)
      self._CloseButton.setFixedHeight(self._TitleLabel.height()) # 設置按鈕高度為標題欄高度
      self._CloseButton.clicked.connect(self.close) # 按鈕信號連接到關閉窗口的槽函數


  def setMinMaxButtons(self, bool):
    # 給widget定義一個setMinMaxButtons函數,為True時設置一組最小化最大化按鈕
    if bool == True:
      self._MinimumButton = QTitleButton(b'\xef\x80\xb0'.decode("utf-8"), self)
      self._MinimumButton.setObjectName("MinMaxButton") # 設置按鈕的ObjectName以在qss樣式表內定義不同的按鈕樣式
      self._MinimumButton.setToolTip("最小化")
      self._MinimumButton.setMouseTracking(True) # 設置按鈕鼠標跟蹤(如不設,則按鈕在widget上層,無法實現跟蹤)
      self._MinimumButton.setFixedHeight(self._TitleLabel.height()) # 設置按鈕高度為標題欄高度
      self._MinimumButton.clicked.connect(self.showMinimized) # 按鈕信號連接到最小化窗口的槽函數
      self._MaximumButton = QTitleButton(b'\xef\x80\xb1'.decode("utf-8"), self)
      self._MaximumButton.setObjectName("MinMaxButton") # 設置按鈕的ObjectName以在qss樣式表內定義不同的按鈕樣式
      self._MaximumButton.setToolTip("最大化")
      self._MaximumButton.setMouseTracking(True) # 設置按鈕鼠標跟蹤(如不設,則按鈕在widget上層,無法實現跟蹤)
      self._MaximumButton.setFixedHeight(self._TitleLabel.height()) # 設置按鈕高度為標題欄高度
      self._MaximumButton.clicked.connect(self._changeNormalButton) # 按鈕信號連接切換到恢復窗口大小按鈕函數

  def _changeNormalButton(self):
    # 切換到恢復窗口大小按鈕
    try:
      self.showMaximized() # 先實現窗口最大化
      self._MaximumButton.setText(b'\xef\x80\xb2'.decode("utf-8")) # 更改按鈕文本
      self._MaximumButton.setToolTip("恢復") # 更改按鈕提示
      self._MaximumButton.disconnect() # 斷開原本的信號槽連接
      self._MaximumButton.clicked.connect(self._changeMaxButton) # 重新連接信號和槽
    except:
      pass

  def _changeMaxButton(self):
    # 切換到最大化按鈕
    try:
      self.showNormal()
      self._MaximumButton.setText(b'\xef\x80\xb1'.decode("utf-8"))
      self._MaximumButton.setToolTip("最大化")
      self._MaximumButton.disconnect()
      self._MaximumButton.clicked.connect(self._changeNormalButton)
    except:
      pass

  def resizeEvent(self, QResizeEvent):
    # 自定義窗口調整大小事件
    self._TitleLabel.setFixedWidth(self.width()) # 將標題標簽始終設為窗口寬度
    # 分別移動三個按鈕到正確的位置
    try:
      self._CloseButton.move(self.width() - self._CloseButton.width(), 0)
    except:
      pass
    try:
      self._MinimumButton.move(self.width() - (self._CloseButton.width() + 1) * 3 + 1, 0)
    except:
      pass
    try:
      self._MaximumButton.move(self.width() - (self._CloseButton.width() + 1) * 2 + 1, 0)
    except:
      pass
    # 重新調整邊界范圍以備實現鼠標拖放縮放窗口大小,采用三個列表生成式生成三個列表
    self._right_rect = [QPoint(x, y) for x in range(self.width() - self._padding, self.width() + 1)
              for y in range(1, self.height() - self._padding)]
    self._bottom_rect = [QPoint(x, y) for x in range(1, self.width() - self._padding)
             for y in range(self.height() - self._padding, self.height() + 1)]
    self._corner_rect = [QPoint(x, y) for x in range(self.width() - self._padding, self.width() + 1)
                  for y in range(self.height() - self._padding, self.height() + 1)]

  def mousePressEvent(self, event):
    # 重寫鼠標點擊的事件
    if (event.button() == Qt.LeftButton) and (event.pos() in self._corner_rect):
      # 鼠標左鍵點擊右下角邊界區域
      self._corner_drag = True
      event.accept()
    elif (event.button() == Qt.LeftButton) and (event.pos() in self._right_rect):
      # 鼠標左鍵點擊右側邊界區域
      self._right_drag = True
      event.accept()
    elif (event.button() == Qt.LeftButton) and (event.pos() in self._bottom_rect):
      # 鼠標左鍵點擊下側邊界區域
      self._bottom_drag = True
      event.accept()
    elif (event.button() == Qt.LeftButton) and (event.y() < self._TitleLabel.height()):
      # 鼠標左鍵點擊標題欄區域
      self._move_drag = True
      self.move_DragPosition = event.globalPos() - self.pos()
      event.accept()

  def mouseMoveEvent(self, QMouseEvent):
    # 判斷鼠標位置切換鼠標手勢
    if QMouseEvent.pos() in self._corner_rect:
      self.setCursor(Qt.SizeFDiagCursor)
    elif QMouseEvent.pos() in self._bottom_rect:
      self.setCursor(Qt.SizeVerCursor)
    elif QMouseEvent.pos() in self._right_rect:
      self.setCursor(Qt.SizeHorCursor)
    else:
      self.setCursor(Qt.ArrowCursor)
    # 當鼠標左鍵點擊不放及滿足點擊區域的要求后,分別實現不同的窗口調整
    # 沒有定義左方和上方相關的5個方向,主要是因為實現起來不難,但是效果很差,拖放的時候窗口閃爍,再研究研究是否有更好的實現
    if Qt.LeftButton and self._right_drag:
      # 右側調整窗口寬度
      self.resize(QMouseEvent.pos().x(), self.height())
      QMouseEvent.accept()
    elif Qt.LeftButton and self._bottom_drag:
      # 下側調整窗口高度
      self.resize(self.width(), QMouseEvent.pos().y())
      QMouseEvent.accept()
    elif Qt.LeftButton and self._corner_drag:
      # 右下角同時調整高度和寬度
      self.resize(QMouseEvent.pos().x(), QMouseEvent.pos().y())
      QMouseEvent.accept()
    elif Qt.LeftButton and self._move_drag:
      # 標題欄拖放窗口位置
      self.move(QMouseEvent.globalPos() - self.move_DragPosition)
      QMouseEvent.accept()

  def mouseReleaseEvent(self, QMouseEvent):
    # 鼠標釋放后,各扳機復位
    self._move_drag = False
    self._corner_drag = False
    self._bottom_drag = False
    self._right_drag = False


if __name__ == "__main__":
  from PyQt5.QtWidgets import QApplication
  import sys
  app = QApplication(sys.argv)
  app.setStyleSheet(open("./UnFrameStyle.qss").read())
  window = QUnFrameWindow()
  window.setCloseButton(True)
  window.setMinMaxButtons(True)
  window.show()
  sys.exit(app.exec_())

qss文件

/**********Title**********/
QTitleLabel{
    background-color: Gainsboro;
    font: 100 10pt;
}


/**********Button**********/
QTitleButton{
    background-color: rgba(255, 255, 255, 0);
    color: black;
    border: 0px;
    font: 100 10pt;
}
QTitleButton#MinMaxButton:hover{
    background-color: #D0D0D1;
    border: 0px;
    font: 100 10pt;
}
QTitleButton#CloseButton:hover{
    background-color: #D32424;
    color: white;
    border: 0px;
    font: 100 10pt;
}

以上是“PyQt5如何實現無邊框窗口的標題拖動和窗口縮放”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荥经县| 剑阁县| 嘉禾县| 泗水县| 台前县| 九台市| 东方市| 阿坝县| 酒泉市| 密山市| 连州市| 博客| 临泉县| 林周县| 曲周县| 鄢陵县| 南充市| 宁南县| 二手房| 岗巴县| 始兴县| 保康县| 台州市| 常州市| 承德县| 绿春县| 蓬溪县| 灯塔市| 波密县| 枣阳市| 壶关县| 长宁县| 陈巴尔虎旗| 攀枝花市| 伊金霍洛旗| 左云县| 钦州市| 河津市| 南靖县| 永福县| 陵水|