FramelessWindowHint 和 WindowStaysOnTopHint 不起作用

问题描述 投票:0回答:2

我希望我的 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

它要求更多的参数,但是当我给它更多的参数时,它说参数太多。 我该如何解决这个问题?

python python-3.x pyqt pyqt5
2个回答
4
投票

您的情况的问题是您必须使用运算符激活这两个属性

|

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

enter image description here

setMask()
用于为小部件提供不同的边框,例如对于 example 我得到以下内容:

enter image description here


0
投票
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)
© www.soinside.com 2019 - 2024. All rights reserved.