首页 > 解决方案 > PyQt5:如何制作圆形应用程序?

问题描述

我想制作圆形的 PyQt5 应用程序。像这样的东西:

预期设计.

我用 qtDesigner 创建了一个基本布局来测试。它包含一个 QFrame(名为“mainFrame”),我用样式表制作了圆形。

我对 mainWindow 进行了同样的尝试……但是,我不知道如何使空的 mainWindow 不可见。

我制作了无框窗口,改变了它的不透明度 - 但它影响了 mainWindow 内的所有内容

基本测试应用程序:

应用程序设计.

代码:

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(500, 500)
        self.mainFrame = QtWidgets.QFrame(Form)
        self.mainFrame.setGeometry(QtCore.QRect(10, 10, 481, 481))
        self.mainFrame.setFrameShape(QtWidgets.QFrame.WinPanel)
        self.mainFrame.setObjectName("mainFrame")
        QtCore.QMetaObject.connectSlotsByName(Form)

        Form.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
        Form.setStyleSheet("QFrame#mainFrame {\n"
        "    border: 5px solid grey;\n"
        "    border-radius: 240px;\n"
        "    background-color: rgba(255, 0, 0, 50);\n"
        "}\n"
        "QWidget#Form {\n"
        "    background-color: rgba(255, 255, 255, 0);\n"
        "    border: 5px solid grey;\n"
        "    border-radius: 250px;\n"
        "}")
        self.mainFrame.mouseDoubleClickEvent = lambda event: QtWidgets.qApp.quit()
        # Form.setWindowOpacity(0.4)
        # self.mainFrame.setWindowOpacity(1)

我怎样才能只显示圆形主框架,以及其中的所有东西?

标签: pythonpython-3.xpyqtpyqt5

解决方案


QRegion::QRegion(const QRect &r, QRegion::RegionType t = 矩形)

这是一个过载功能。

基于区域类型 t 的矩形 r 创建一个区域。

如果矩形无效,将创建一个空区域。


QWidget::setMask(const QRegion ®ion)

这是一个过载功能。

仅使与区域重叠的小部件部分可见。如果该区域包括小部件的 rect() 之外的像素,则该区域中的窗口系统控件可能可见也可能不可见,具体取决于平台。

请注意,如果区域特别复杂,这种效果可能会很慢。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QRegion


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(500, 500)
        self.mainFrame = QtWidgets.QFrame(Form)
        self.mainFrame.setGeometry(QtCore.QRect(10, 10, 481, 481))
        self.mainFrame.setFrameShape(QtWidgets.QFrame.WinPanel)
        self.mainFrame.setObjectName("mainFrame")
        QtCore.QMetaObject.connectSlotsByName(Form)

        Form.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
        Form.setStyleSheet("QFrame#mainFrame {\n"
        "    border: 5px solid grey;\n"
        "    border-radius: 240px;\n"
        "    background-color: rgba(255, 0, 0, 50);\n"
        "}\n"
        "QWidget#Form {\n"
        "    background-color: rgba(255, 255, 255, 0);\n"
        "    border: 5px solid grey;\n"
        "    border-radius: 250px;\n"
        "}")
        self.mainFrame.mouseDoubleClickEvent = lambda event: QtWidgets.qApp.quit()
        # Form.setWindowOpacity(0.4)
        # self.mainFrame.setWindowOpacity(1)
        

class MainWindow(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)

        self.region_and_mask()

    def region_and_mask(self):
        my_region = QRegion(self.rect(), QRegion.Ellipse)
        self.setMask(my_region)        


if __name__ == '__main__': 
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

在此处输入图像描述


推荐阅读