無(wú)邊框窗口可以脫離系統(tǒng)外觀的束縛,從而實(shí)現(xiàn)無(wú)限可能潭枣。但同時(shí)也意味著要重寫(xiě)一套交互邏輯。
實(shí)現(xiàn)無(wú)邊框
self.setWindowFlags(Qt.FramelessWindowHint)
鼠標(biāo)拖動(dòng)窗口
首先定義一個(gè) self.ismoving = False
用來(lái)記錄當(dāng)前的移動(dòng)狀態(tài)幻捏。然后重載三個(gè)鼠標(biāo)事件盆犁。
?? 1. 當(dāng)鼠標(biāo)左鍵被按下時(shí),將 self.ismoving
設(shè)為真篡九,然后記錄當(dāng)前鼠標(biāo)位置 self.start_point
和窗口位置 self.window_point
谐岁。
def mousePressEvent(self, e):
if e.button() == Qt.LeftButton:
self.ismoving = True
self.start_point = e.globalPos()
self.window_point = self.frameGeometry().topLeft()
?? 2. 當(dāng)鼠標(biāo)移動(dòng)時(shí),如果 ismoving
為真榛臼,那就獲取鼠標(biāo)的位移伊佃,并將其加到窗口位置上。
def mouseMoveEvent(self, e):
if self.ismoving:
relpos = e.globalPos() - self.start_point # QPoint 類(lèi)型可以直接相減
self.move(self.window_point + relpos) # 所以說(shuō) Qt 真是贊沛善!
?? 3. 當(dāng)鼠標(biāo)釋放后航揉,把狀態(tài)改回來(lái)。
def mouseReleaseEvent(self, e):
self.ismoving = False
加點(diǎn)難度
如果鼠標(biāo)點(diǎn)擊窗口可以將其關(guān)閉金刁,同時(shí)又能響應(yīng)鼠標(biāo)拖動(dòng)呢帅涂?
def mousePressEvent(self, e):
self.start_point = e.globalPos()
self.window_point = self.frameGeometry().topLeft()
def mouseMoveEvent(self, e):
self.ismoving = True
relpos = e.globalPos() - self.start_point
self.move(self.window_point + relpos)
def mouseReleaseEvent(self, e):
if not self.ismoving:
self.close()
self.ismoving = False