0
由於所有窗口管理器都不支持此功能,因此我曾想過在顯示背景之前複製背景。
但是這帶來了幾個問題。
- 背景並不總是正確備份。我不知道爲什麼。
- 使用此方法不可能用鼠標移動窗口。因爲用hide()和show()焦點會丟失。模擬透明背景
您是否認爲這些問題有解決方案?
#!/bin/env python3
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QPainter, QPen
from PyQt5.QtWidgets import QApplication, QMainWindow
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowFlags(Qt.FramelessWindowHint)
self.offset= None
self.ps= app.primaryScreen()
self.setGeometry(500, 500, 200, 200)
self.saveBackground()
def keyPressEvent(self, event):
if event.key() == Qt.Key_Escape:
self.close()
elif event.key() in [ Qt.Key_Left, Qt.Key_Right, Qt.Key_Up, Qt.Key_Down ]:
point= self.geometry().topLeft()
if event.key() == Qt.Key_Left:
point.setX(point.x() - 1)
elif event.key() == Qt.Key_Right:
point.setX(point.x() + 1)
elif event.key() == Qt.Key_Up:
point.setY(point.y() - 1)
elif event.key() == Qt.Key_Down:
point.setY(point.y() + 1)
self.move(point)
self.saveBackground()
def mousePressEvent(self, event):
self.offset= event.pos()
def mouseMoveEvent(self, event):
self.move(self.mapToParent(event.pos() - self.offset))
self.saveBackground()
def paintEvent(self, event):
qp= QPainter()
qp.begin(self)
qp.drawPixmap(0, 0, self.pix)
qp.setPen(QPen(QColor(255, 0, 0), 2, Qt.SolidLine))
qp.drawRect(1, 1, self.width() - 2, self.height() - 2)
def saveBackground(self):
geo= self.frameGeometry()
self.hide()
self.pix= self.ps.grabWindow(app.desktop().winId(), geo.x(), geo.y(), geo.width(), geo.height())
self.show()
if __name__ == "__main__":
app= QApplication([])
ui= Window()
ui.show()
exit(app.exec_())