python - 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)
我怎样才能只显示圆形主框架,以及其中的所有东西?
解决方案
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_())
推荐阅读
- reactjs - 如何使用 React 在 HTML 中显示 Wiki 页面
- python - 将一个 CSV 作为查找与另一个 CSV 进行比较时,1<>1 何时出现?
- java - Java LibGDX:Tiledmap 不在顶部和右侧呈现
- mysql - 如何检查连接查询中字段的过滤器长度?
- php - jQuery 序列化括号 [] 从表单名称发布到 PHP
- haskell - Haskell:将包含简单算术表达式的字符串评估为 Int
- php - 通过 Guzzle 客户端发送图像
- azure-devops - 我们如何在 Azure Devops 的多行文本字段中添加自动文本(用户名、时间戳)?
- matlab - Simulink:在范围/块中绘制时间序列以可视化数据
- apache-spark - 缓存值 - Spark