如何在Qframe pyqt5中调用PaintEvent?

发布于 2025-02-04 18:00:32 字数 7635 浏览 3 评论 0原文

在PYQT5中,我想在名为Days的Qframe中插入一个圆形条。为此,我已经绘制了一个圆形的条,但我无法在Qframe下称其为。在过去的两行中,我试图将其称为框架,但它不起作用。如果有人能提供帮助,我将非常感谢它! coundular_bar.py

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

shwd = 10


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Hatchery System")
        self.setStyleSheet("background-color: #2c313c;")
        self.resize(900, 500)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
        # self.setWindowFlags(Qt.FramelessWindowHint)

        self.days_frame = QtWidgets.QFrame(self)
        self.days_frame.setGeometry(QtCore.QRect(200, 100, 395, 300))
        self.days_frame.setStyleSheet("background-color: #222931;" "border-radius: 10px;" "padding: 5px;")
        shadow = QGraphicsDropShadowEffect()
        shadow.setBlurRadius(shwd)
        shadow.setColor(QColor(Qt.white))
        shadow.setOffset(0)
        self.days_frame.setGraphicsEffect(shadow)

        self.days_label = QtWidgets.QLabel('Days', self.days_frame)
        self.days_label.setGeometry(QtCore.QRect(10, 10, 131, 41))
        self.days_label.setStyleSheet("color: white;")
        font = QtGui.QFont()
        font.setPointSize(13)
        self.days_label.setFont(font)
        # self.days_frame(paintEvent)


    def paintEvent(self, e):
        self.value = 0
        self.width = 200
        self.height = 200
        self.progress_width = 10
        self.progress_rounded_cap = True
        self.max_value = 100
        self.progress_color = 0xff79c6
        # Text
        self.enable_text = True
        self.font_family = "Segoe UI"
        self.font_size = 12
        self.suffix = "%"
        self.text_color = 0xff79c6
        # BG
        self.enable_bg = True
        self.bg_color = 0x44475a
        # SET PROGRESS PARAMETERS
        width = self.width - self.progress_width
        height = self.height - self.progress_width
        margin = self.progress_width / 2
        value = self.value * 360 / self.max_value

        # PAINTER
        paint = QPainter(self)
        paint.begin(self)
        paint.setRenderHint(QPainter.Antialiasing)  # remove pixelated edges
        paint.setFont(QFont(self.font_family, self.font_size))

        # CREATE RECTANGLE
        rect = QRect(0, 0, self.width, self.height)
        paint.setPen(Qt.NoPen)
        paint.drawRect(rect)

        # PEN
        pen = QPen()
        pen.setWidth(self.progress_width)
        # Set Round Cap
        if self.progress_rounded_cap:
            pen.setCapStyle(Qt.RoundCap)

        # ENABLE BG
        if self.enable_bg:
            pen.setColor(QColor(self.bg_color))
            paint.setPen(pen)
            paint.drawArc(margin, margin, width, height, 0, 360 * 16)

        # CREATE ARC / CIRCULAR PROGRESS
        pen.setColor(QColor(self.progress_color))
        paint.setPen(pen)
        paint.drawArc(margin, margin, width, height, -90 * 16, -value * 16)

        # CREATE TEXT
        if self.enable_text:
            pen.setColor(QColor(self.text_color))
            paint.setPen(pen)
            paint.drawText(rect, Qt.AlignCenter, f"{self.value}{self.suffix}")

        # END
        paint.end()
        # tring to call paintEvent
        self.days_frame(paintEvent(self, e))
        #self.days_frame.paintEvent(self, e)


app = QApplication([])
mw = MainWindow()
mw.show()
app.exec_()

输出

更新的代码
progress.py

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

class CircularProgress(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

    # CUSTOM PROPERTIES
    self.value = 0
    self.width = 200
    self.height = 200
    self.progress_width = 10
    self.progress_rounded_cap = True
    self.max_value = 100
    self.progress_color = 0xff79c6
    # Text
    self.enable_text = True
    self.font_family = "Segoe UI"
    self.font_size = 12
    self.suffix = "%"
    self.text_color = 0xff79c6
    # BG
    self.enable_bg = True
    self.bg_color = 0x44475a

    # SET DEFAULT SIZE WITHOUT LAYOUT
    self.resize(self.width, self.height)
    self.show()

# ADD DROPSHADOW
def add_shadow(self, enable):
    if enable:
        self.shadow = QGraphicsDropShadowEffect(self)
        self.shadow.setBlurRadius(15)
        self.shadow.setXOffset(0)
        self.shadow.setYOffset(0)
        self.shadow.setColor(QColor(0, 0, 0, 80))
        self.setGraphicsEffect(self.shadow)

# SET VALUE
def set_value(self, value):
    self.value = value
    self.repaint()  # Render progress bar after change value

# PAINT EVENT (DESIGN YOUR CIRCULAR PROGRESS HERE)
def paintEvent(self, e):
    # SET PROGRESS PARAMETERS
    width = self.width - self.progress_width
    height = self.height - self.progress_width
    margin = self.progress_width / 2
    value = self.value * 360 / self.max_value

    # PAINTER
    paint = QPainter()
    paint.begin(self)
    paint.setRenderHint(QPainter.Antialiasing)  # remove pixelated edges
    paint.setFont(QFont(self.font_family, self.font_size))

    # CREATE RECTANGLE
    rect = QRect(0, 0, self.width, self.height)
    paint.setPen(Qt.NoPen)
    paint.drawRect(rect)

    # PEN
    pen = QPen()
    pen.setWidth(self.progress_width)
    # Set Round Cap
    if self.progress_rounded_cap:
        pen.setCapStyle(Qt.RoundCap)

    # ENABLE BG
    if self.enable_bg:
        pen.setColor(QColor(self.bg_color))
        paint.setPen(pen)
        paint.drawArc(margin, margin, width, height, 0, 360 * 16)

    # CREATE ARC / CIRCULAR PROGRESS
    pen.setColor(QColor(self.progress_color))
    paint.setPen(pen)
    paint.drawArc(margin, margin, width, height, -90 * 16, -value * 16)

    # CREATE TEXT
    if self.enable_text:
        pen.setColor(QColor(self.text_color))
        paint.setPen(pen)
        paint.drawText(rect, Qt.AlignCenter, f"{self.value}{self.suffix}")

    # END
    paint.end()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = CircularProgress()
    sys.exit(app.exec_())

main.py.py

from circularBar import CircularProgress
class MainWindow(QMainWindow):
def __init__(self):
    QMainWindow.__init__(self)
self.days_frame = QtWidgets.QFrame(self)
    self.days_frame.setGeometry(QtCore.QRect(845, 150, 395, 300))
    self.days_frame.setStyleSheet("background-color: #222931;" "border-radius: 10px;" "padding: 5px;")
    shadow = QGraphicsDropShadowEffect()
    shadow.setBlurRadius(shwd)
    shadow.setColor(QColor(Qt.white))
    shadow.setOffset(0)
    self.days_frame.setGraphicsEffect(shadow)

    self.days_label = QtWidgets.QLabel('Days', self.days_frame)
    self.days_label.setGeometry(QtCore.QRect(10, 10, 131, 41))
    self.days_label.setStyleSheet("color: white;")
    font = QtGui.QFont
    font.setPointSize(13)
    self.days_label.setFont(font)
    # self.days_frame
    self.progress = CircularProgress(self.days_frame)
app = QApplication([])
mw = MainWindow()
mw.show()
app.exec_()

错误:

In pyqt5, I want to insert a circular bar in my QFrame named days. For that, I have painted a circular bar but I am unable to call it under a Qframe. In the last two lines, I am trying to call it under a frame but somehow it doesn't work. I would appreciate it greatly if anybody could help!
circular_bar.py

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

shwd = 10


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Hatchery System")
        self.setStyleSheet("background-color: #2c313c;")
        self.resize(900, 500)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
        # self.setWindowFlags(Qt.FramelessWindowHint)

        self.days_frame = QtWidgets.QFrame(self)
        self.days_frame.setGeometry(QtCore.QRect(200, 100, 395, 300))
        self.days_frame.setStyleSheet("background-color: #222931;" "border-radius: 10px;" "padding: 5px;")
        shadow = QGraphicsDropShadowEffect()
        shadow.setBlurRadius(shwd)
        shadow.setColor(QColor(Qt.white))
        shadow.setOffset(0)
        self.days_frame.setGraphicsEffect(shadow)

        self.days_label = QtWidgets.QLabel('Days', self.days_frame)
        self.days_label.setGeometry(QtCore.QRect(10, 10, 131, 41))
        self.days_label.setStyleSheet("color: white;")
        font = QtGui.QFont()
        font.setPointSize(13)
        self.days_label.setFont(font)
        # self.days_frame(paintEvent)


    def paintEvent(self, e):
        self.value = 0
        self.width = 200
        self.height = 200
        self.progress_width = 10
        self.progress_rounded_cap = True
        self.max_value = 100
        self.progress_color = 0xff79c6
        # Text
        self.enable_text = True
        self.font_family = "Segoe UI"
        self.font_size = 12
        self.suffix = "%"
        self.text_color = 0xff79c6
        # BG
        self.enable_bg = True
        self.bg_color = 0x44475a
        # SET PROGRESS PARAMETERS
        width = self.width - self.progress_width
        height = self.height - self.progress_width
        margin = self.progress_width / 2
        value = self.value * 360 / self.max_value

        # PAINTER
        paint = QPainter(self)
        paint.begin(self)
        paint.setRenderHint(QPainter.Antialiasing)  # remove pixelated edges
        paint.setFont(QFont(self.font_family, self.font_size))

        # CREATE RECTANGLE
        rect = QRect(0, 0, self.width, self.height)
        paint.setPen(Qt.NoPen)
        paint.drawRect(rect)

        # PEN
        pen = QPen()
        pen.setWidth(self.progress_width)
        # Set Round Cap
        if self.progress_rounded_cap:
            pen.setCapStyle(Qt.RoundCap)

        # ENABLE BG
        if self.enable_bg:
            pen.setColor(QColor(self.bg_color))
            paint.setPen(pen)
            paint.drawArc(margin, margin, width, height, 0, 360 * 16)

        # CREATE ARC / CIRCULAR PROGRESS
        pen.setColor(QColor(self.progress_color))
        paint.setPen(pen)
        paint.drawArc(margin, margin, width, height, -90 * 16, -value * 16)

        # CREATE TEXT
        if self.enable_text:
            pen.setColor(QColor(self.text_color))
            paint.setPen(pen)
            paint.drawText(rect, Qt.AlignCenter, f"{self.value}{self.suffix}")

        # END
        paint.end()
        # tring to call paintEvent
        self.days_frame(paintEvent(self, e))
        #self.days_frame.paintEvent(self, e)


app = QApplication([])
mw = MainWindow()
mw.show()
app.exec_()

output
enter image description here

Updated Code
progress.py

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

class CircularProgress(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

    # CUSTOM PROPERTIES
    self.value = 0
    self.width = 200
    self.height = 200
    self.progress_width = 10
    self.progress_rounded_cap = True
    self.max_value = 100
    self.progress_color = 0xff79c6
    # Text
    self.enable_text = True
    self.font_family = "Segoe UI"
    self.font_size = 12
    self.suffix = "%"
    self.text_color = 0xff79c6
    # BG
    self.enable_bg = True
    self.bg_color = 0x44475a

    # SET DEFAULT SIZE WITHOUT LAYOUT
    self.resize(self.width, self.height)
    self.show()

# ADD DROPSHADOW
def add_shadow(self, enable):
    if enable:
        self.shadow = QGraphicsDropShadowEffect(self)
        self.shadow.setBlurRadius(15)
        self.shadow.setXOffset(0)
        self.shadow.setYOffset(0)
        self.shadow.setColor(QColor(0, 0, 0, 80))
        self.setGraphicsEffect(self.shadow)

# SET VALUE
def set_value(self, value):
    self.value = value
    self.repaint()  # Render progress bar after change value

# PAINT EVENT (DESIGN YOUR CIRCULAR PROGRESS HERE)
def paintEvent(self, e):
    # SET PROGRESS PARAMETERS
    width = self.width - self.progress_width
    height = self.height - self.progress_width
    margin = self.progress_width / 2
    value = self.value * 360 / self.max_value

    # PAINTER
    paint = QPainter()
    paint.begin(self)
    paint.setRenderHint(QPainter.Antialiasing)  # remove pixelated edges
    paint.setFont(QFont(self.font_family, self.font_size))

    # CREATE RECTANGLE
    rect = QRect(0, 0, self.width, self.height)
    paint.setPen(Qt.NoPen)
    paint.drawRect(rect)

    # PEN
    pen = QPen()
    pen.setWidth(self.progress_width)
    # Set Round Cap
    if self.progress_rounded_cap:
        pen.setCapStyle(Qt.RoundCap)

    # ENABLE BG
    if self.enable_bg:
        pen.setColor(QColor(self.bg_color))
        paint.setPen(pen)
        paint.drawArc(margin, margin, width, height, 0, 360 * 16)

    # CREATE ARC / CIRCULAR PROGRESS
    pen.setColor(QColor(self.progress_color))
    paint.setPen(pen)
    paint.drawArc(margin, margin, width, height, -90 * 16, -value * 16)

    # CREATE TEXT
    if self.enable_text:
        pen.setColor(QColor(self.text_color))
        paint.setPen(pen)
        paint.drawText(rect, Qt.AlignCenter, f"{self.value}{self.suffix}")

    # END
    paint.end()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = CircularProgress()
    sys.exit(app.exec_())

main.py

from circularBar import CircularProgress
class MainWindow(QMainWindow):
def __init__(self):
    QMainWindow.__init__(self)
self.days_frame = QtWidgets.QFrame(self)
    self.days_frame.setGeometry(QtCore.QRect(845, 150, 395, 300))
    self.days_frame.setStyleSheet("background-color: #222931;" "border-radius: 10px;" "padding: 5px;")
    shadow = QGraphicsDropShadowEffect()
    shadow.setBlurRadius(shwd)
    shadow.setColor(QColor(Qt.white))
    shadow.setOffset(0)
    self.days_frame.setGraphicsEffect(shadow)

    self.days_label = QtWidgets.QLabel('Days', self.days_frame)
    self.days_label.setGeometry(QtCore.QRect(10, 10, 131, 41))
    self.days_label.setStyleSheet("color: white;")
    font = QtGui.QFont
    font.setPointSize(13)
    self.days_label.setFont(font)
    # self.days_frame
    self.progress = CircularProgress(self.days_frame)
app = QApplication([])
mw = MainWindow()
mw.show()
app.exec_()

Error:
enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文