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_())