歡迎您光臨本站 註冊首頁

PyQt5實現仿QQ貼邊隱藏功能的實例代碼

←手機掃碼閱讀     ml5rwbikls @ 2020-06-09 , reply:0

此程序大致功能為:可變換顏色,貼邊隱藏。

變換顏色思路

QPalette( [ˈpælət] 調色板)類相當於對話框或控件的調色板,它管理著控件或窗體的所有顏色信息,每個窗體或控件都包含一個QPalette對象,在顯示時按照它的QPalette對象中對各部分各狀態下的顏色的描述來進行繪製。

實現代碼

  def Painting(self):   color = random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"])   palette1 = QPalette()   palette1.setColor(self.backgroundRole(),      QColor("#{}".format(color))) # 改變窗體顏色   self.setPalette(palette1)

 

貼邊隱藏思路

可以判斷窗口的位置,當與邊緣的距離小於某值時,再判斷鼠標是否在窗口,判斷是否隱藏窗口;
 根據隱藏窗口的隱藏位置,獲得某塊區域,當鼠標在這個位置時,顯示窗口。

實現代碼

鼠標進入事件,調用hide_or_show判斷是否該顯示

  def enterEvent(self, event):   self.hide_or_show('show', event)

 

鼠標離開事件,調用hide_or_show判斷是否該隱藏

  def leaveEvent(self, event):   self.hide_or_show('hide', event)

 

鼠標點擊事件

  def mousePressEvent(self, event):   if event.button() == Qt.LeftButton:    self.dragPosition = event.globalPos() - self.frameGeometry(    ).topLeft()    QApplication.postEvent(self, QEvent(174))    event.accept()

 

捕捉鼠標移動事件

  def mouseMoveEvent(self, event):   if event.buttons() == Qt.LeftButton:    try:    self.move(event.globalPos() - self.dragPosition)    event.accept()    except:pass

 

判斷是否該隱藏

  def hide_or_show(self, mode, event):   pos = self.frameGeometry().topLeft()   if mode == 'show' and self.moved:    if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT: # 右側顯示    self.startAnimation(SCREEN_WEIGHT - WINDOW_WEIGHT + 2, pos.y())    event.accept()    self.moved = False    elif pos.x() <= 0: # 左側顯示    self.startAnimation(0,pos.y())    event.accept()    self.moved = False    elif pos.y() = SCREEN_WEIGHT: # 右側隱藏    self.startAnimation(SCREEN_WEIGHT - 2,pos.y())    event.accept()    self.moved = True    elif pos.x() <= 2: # 左側隱藏    self.startAnimation(2 - WINDOW_WEIGHT,pos.y())    event.accept()    self.moved = True    elif pos.y() <= 2: # 頂層隱藏    self.startAnimation(pos.x(),2 - WINDOW_HEIGHT)    event.accept()    self.moved = True

 

將劃入劃出作為屬性動畫

  def startAnimation(self,width,height):   animation = QPropertyAnimation(self,b"geometry",self)   startpos = self.geometry()   animation.setDuration(200)   newpos = QRect(width,height,startpos.width(),startpos.height())   animation.setEndValue(newpos)   animation.start()

 

完整代碼

  import sys,random  from PyQt5.QtGui import QPalette,QColor  from PyQt5.QtWidgets import QWidget,QVBoxLayout,QPushButton,   QDesktopWidget,QApplication  from PyQt5.QtCore import Qt,QRect,QEvent,QPoint  from PyQt5.Qt import QCursor,QPropertyAnimation    SCREEN_WEIGHT = 1920  SCREEN_HEIGHT = 1080  WINDOW_WEIGHT = 300  WINDOW_HEIGHT = 600  class Ui_Form(QWidget):   def __init__(self):   self.moved = False   super(Ui_Form,self).__init__()   self.setupUi()   self.resize(WINDOW_WEIGHT, WINDOW_HEIGHT)   self.show()   def setupUi(self):   self.setWindowFlags(Qt.FramelessWindowHint      | Qt.WindowStaysOnTopHint      | Qt.Tool) # 去掉標題欄   self.widget = QWidget()   self.Layout = QVBoxLayout(self.widget)   self.Layout.setContentsMargins(0,0,0,0)   self.setLayout(self.Layout)   self.setWindowFlag(Qt.Tool)   self.main_widget = QWidget()   self.Layout.addWidget(self.main_widget)   self.paint = QPushButton(self.main_widget)   self.paint.setText("改變顏色")   self.paint.move(QPoint(120,200))   self.paint.clicked.connect(self.Painting)   self.exit = QPushButton(self.main_widget)   self.exit.setText(" 退出 ")   self.exit.move(QPoint(120,400))   self.exit.clicked.connect(lambda:exit(0))   self.setStyleSheet('''    QPushButton {    color: rgb(137, 221, 255);    background-color: rgb(37, 121, 255);    border-style:none;    border:1px solid #3f3f3f;    padding:5px;    min-height:20px;    border-radius:15px;    }    ''')   def Painting(self):   color = random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"])   palette1 = QPalette()   palette1.setColor(self.backgroundRole(),      QColor("#{}".format(color))) # 改變窗體顏色   self.setPalette(palette1)   def enterEvent(self, event):   self.hide_or_show('show', event)   def leaveEvent(self, event):   self.hide_or_show('hide', event)   def mousePressEvent(self, event):   if event.button() == Qt.LeftButton:    self.dragPosition = event.globalPos() - self.frameGeometry(    ).topLeft()    QApplication.postEvent(self, QEvent(174))    event.accept()   def mouseMoveEvent(self, event):   if event.buttons() == Qt.LeftButton:    try:    self.move(event.globalPos() - self.dragPosition)    event.accept()    except:pass   #def mouseReleaseEvent(self, event):   #self.moved = True   #self.hide_or_show('show', event)   def hide_or_show(self, mode, event):   pos = self.frameGeometry().topLeft()   if mode == 'show' and self.moved:    if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT: # 右側顯示    self.startAnimation(SCREEN_WEIGHT - WINDOW_WEIGHT + 2, pos.y())    event.accept()    self.moved = False    elif pos.x() <= 0: # 左側顯示    self.startAnimation(0,pos.y())    event.accept()    self.moved = False    elif pos.y() = SCREEN_WEIGHT: # 右側隱藏    self.startAnimation(SCREEN_WEIGHT - 2,pos.y())    event.accept()    self.moved = True    elif pos.x() <= 2: # 左側隱藏    self.startAnimation(2 - WINDOW_WEIGHT,pos.y())    event.accept()    self.moved = True    elif pos.y() <= 2: # 頂層隱藏    self.startAnimation(pos.x(),2 - WINDOW_HEIGHT)    event.accept()    self.moved = True   def startAnimation(self,width,height):   animation = QPropertyAnimation(self,b"geometry",self)   startpos = self.geometry()   animation.setDuration(200)   newpos = QRect(width,height,startpos.width(),startpos.height())   animation.setEndValue(newpos)   animation.start()  if __name__ == "__main__":   app = QApplication(sys.argv)   ui = Ui_Form()   sys.exit(app.exec_())

   


[ml5rwbikls ] PyQt5實現仿QQ貼邊隱藏功能的實例代碼已經有271次圍觀

http://coctec.com/docs/python/shhow-post-237633.html