我希望我的 PyQt5 程序是无框架的并且始终位于屏幕顶部。当我使用 WindowStayOnTopHint 时,它工作正常,但是当我将它与 FramelessWindowHint 一起使用时,它会变成无框架,但不会停留在屏幕顶部。经过一些研究后,我发现了this,它说尝试使用setMask,但我无法让它工作。
这是我的代码:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QLabel
class Invisible(QLabel):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.__press_pos = None
self.initUI()
def initUI(self):
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.setMask() #This is where I use the setMask function, but it raises an error
self.setAttribute(Qt.WA_TranslucentBackground)
self.setText("Drag me...")
self.setFont(QFont("Times", 50, QFont.Bold))
self.adjustSize()
self.move(QApplication.instance().desktop().screen().rect().center()
- self.rect().center())
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.__press_pos = event.pos()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.__press_pos = None
def mouseMoveEvent(self, event):
if self.__press_pos:
self.move(self.pos() + (event.pos() - self.__press_pos))
def main():
app = QApplication(sys.argv)
w = Invisible()
w.show()
return app.exec_()
if __name__ == '__main__':
sys.exit(main())
这段代码给了我错误:
TypeError: arguments did not match any overloaded call:
setMask(self, QBitmap): not enough arguments
setMask(self, QRegion): not enough arguments
它要求更多的参数,但是当我给它更多的参数时,它说参数太多。 我该如何解决这个问题?
您的情况的问题是您必须使用运算符激活这两个属性
|
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
完整代码:
import sys
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QLabel, QStyle
class Invisible(QLabel):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.__press_pos = QPoint()
self.initUI()
def initUI(self):
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.setText("Drag me...")
self.setFont(QFont("Times", 50, QFont.Bold))
self.adjustSize()
self.setGeometry(
QStyle.alignedRect(
Qt.LeftToRight,
Qt.AlignCenter,
self.size(),
QApplication.instance().desktop().availableGeometry()
)
)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.__press_pos = event.pos()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.__press_pos = QPoint()
def mouseMoveEvent(self, event):
if not self.__press_pos.isNull():
self.move(self.pos() + (event.pos() - self.__press_pos))
def main():
app = QApplication(sys.argv)
w = Invisible()
w.show()
return app.exec_()
if __name__ == '__main__':
sys.exit(main())
setMask()
用于为小部件提供不同的边框,例如对于 example 我得到以下内容:
The below code worked for me:
class WaitDialog(QtWidgets.QDialog):
def __init__(self, parent):
super(WaitDialog, self).__init__(parent=parent)
self.wanttoclose = False
uic.loadUi(os.path.join(os.path.dirname(__file__), "wait-dialog.ui"), self)
self.setWindowFlag(QtCore.Qt.WindowStaysOnTopHint, True)
self.setWindowFlag(QtCore.Qt.FramelessWindowHint, True)