PyQt5實現(xiàn)仿QQ貼邊隱藏功能的實例代碼
此程序大致功能為:可變換顏色,貼邊隱藏。
變換顏色思路
QPalette( [ˈpælət] 調色板)類相當于對話框或控件的調色板,它管理著控件或窗體的所有顏色信息,每個窗體或控件都包含一個QPalette對象,在顯示時按照它的QPalette對象中對各部分各狀態(tài)下的顏色的描述來進行繪制。
實現(xiàn)代碼
def Painting(self):
color = random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"])
palette1 = QPalette()
palette1.setColor(self.backgroundRole(),
QColor("#{}".format(color))) # 改變窗體顏色
self.setPalette(palette1)
貼邊隱藏思路
可以判斷窗口的位置,當與邊緣的距離小于某值時,再判斷鼠標是否在窗口,判斷是否隱藏窗口;
根據(jù)隱藏窗口的隱藏位置,獲得某塊區(qū)域,當鼠標在這個位置時,顯示窗口。
實現(xiàn)代碼
鼠標進入事件,調用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() <= 0: # 頂層顯示 self.startAnimation(pos.x(),0) event.accept() self.moved = False elif mode == 'hide': if pos.x() + WINDOW_WEIGHT >= 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() <= 0: # 頂層顯示
self.startAnimation(pos.x(),0)
event.accept()
self.moved = False
elif mode == 'hide':
if pos.x() + WINDOW_WEIGHT >= 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_())
總結
到此這篇關于PyQt5實現(xiàn)仿QQ貼邊隱藏功能的文章就介紹到這了,更多相關PyQt5實現(xiàn)隱藏內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
PyCharm專業(yè)最新版2019.1安裝步驟(含激活碼)
這篇文章主要介紹了PyCharm專業(yè)最新版2019.1安裝步驟(含激活碼),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10

