RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1271481
Accepted
hyper-cookie
hyper-cookie
Asked:2022-04-18 03:35:52 +0000 UTC2022-04-18 03:35:52 +0000 UTC 2022-04-18 03:35:52 +0000 UTC

矩形不在 PyQt5 中绘制 - QPainter

  • 772

有一个程序преобразования температуры из градусов цельсия в фаренгейт и обратно。在第一个输入字段中,用户必须输入一个值,单击所需的按钮进行转换,转换结果应出现在下面的表格中(带有题字答案):

在此处输入图像描述

此外,在结果以第二种形式出现后,应以最低绘制形式绘制一个矩形(比例),其长度将等于温度变换的结果:

在此处输入图像描述

它应该是这样的:

在此处输入图像描述

但我做不到。代码会在下面,现在我给大家讲一下这段代码绘制的大致原理:类中
的方法一直被激活(这段代码我是从别的网站复制过来的,原理我也不是很懂这样的工作,但一般意思是这样),当程序第一次启动时()方法启动,它绘制“温度计主体”并将变量更改为。paintEventFormBuilderself.launch = "first"draw_thermometerself.launch"second"

现在,当方法被激活时paintEvent,方法被执行fill_thermometer,但是温度计的“刻度”(如上图,红色刻度)的绘制不会发生。

请帮我解决这个问题。如果有任何帮助,我将非常高兴!

PS 代码的重要部分(负责绘制)用注释标记# важный метод!

导入系统
从 PyQt5.QtWidgets 导入 QWidget、QPushButton、QLabel、QHBoxLayout、QVBoxLayout、QLineEdit、QFormLayout、\
    QGroupBox、QMainWindow、QGridLayout、QApplication
从 PyQt5.QtCore 导入 Qt
从 PyQt5.QtGui 导入 QFont、QPainter、QColor、QPen、QIcon

窗口高度 = 210
窗口宽度 = 300
WINDOW_NAME = '温度'
WINDOW_ICON_NAME = '图片\\main_logo.png'

MAIN_FONT = '时间'
FONT_HEADER_SIZE = 13
FONT_BODY_SIZE = 8


类FormBuilder(QWidget):
    def __init__(self, parent=None):
        super().__init__(父)

        self.launch = "第一"

        self.create_all_forms()
        self.fill_forms()
        self.create_layers()

    def create_all_forms(self):
        self.heading_label = QLabel()
        self.entering_label = QLabel()

        self.first_value = QLineEdit(placeholderText="Value T")
        self.second_value = QLineEdit(placeholderText="Answer")

        self.celc_button = QPushButton("转摄氏度")
        self.far_button = QPushButton("到华氏度")

        self.first_draw_label = QLabel(" ")
        self.second_draw_label = QLabel(" ")

    定义填充表格(自我):
        self.heading_label.setText("CF 温度换算")
        self.heading_label.setFont(QFont(MAIN_FONT, FONT_HEADER_SIZE, QFont.Bold))

        self.entering_label.setText("温度值")
        self.entering_label.setFont(QFont(MAIN_FONT, FONT_HEADER_SIZE))

        self.second_value.setDisabled(True)

        self.celc_button.setMinimumWidth(125)
        self.celc_button.clicked.connect(self.make_celc)

        self.far_button.clicked.connect(self.make_far)

        self.first_draw_label.resize(500, 500)

    def create_layers(self):
        main_layout = QVBoxLayout(self)

        标题标签 = QHBoxLayout()
        heading_label.addWidget(self.heading_label)
        main_layout.addLayout(heading_label)

        self.first_groupbox = QGroupBox(self.entering_label.text())
        self.first_groupbox.setStyleSheet('''
                    QGroupBox {
                        保证金顶部:2ex;
                    }
                    QGroupBox:启用{
                        边框:3px 纯灰色;
                        边框半径:5px
                    }
                    QGroupBox::title {
                        subcontrol-origin:边距;
                        左:3ex;
                    }
                ''')
        first_groupbox_layout = QVBoxLayout(self.first_groupbox)
        first_groupbox_layout.addWidget(self.first_value)
        first_groupbox_layout.addWidget(self.second_value)
        main_layout.addWidget(self.first_groupbox)

        button_line = QFormLayout()
        button_line.addRow(self.celc_button, self.far_button)
        main_layout.addLayout(button_line)

        first_draw_label = QHBoxLayout()
        first_draw_label.addWidget(self.first_draw_label)
        main_layout.addLayout(first_draw_label)

        second_draw_label = QHBoxLayout()
        second_draw_label.addWidget(self.second_draw_label)
        main_layout.addLayout(second_draw_label)

    def paintEvent(self, e): # 重要方法!
        qp = QPainter()
        qp.开始(自我)
        如果 self.launch == “第一”:
            self.draw_thermometer(qp)
        elif self.launch == “第二”:
            self.fill_thermometer(qp)
        qp.end()

    def draw_thermometer(self, qp): # 重要方法!
        col = QColor(0, 0, 0)
        col.setNamedColor('#d4d4d4')
        qp.setPen(col)

        qp.setBrush(QColor(112, 106, 104))
        qp.drawRoundedRect(10, 150, 260, 35, 5, 5)
        qp.setBrush(QColor(194, 189, 186))
        qp.drawRect(15, 155, 250, 25)

        self.launch = 2

    def make_celc(self):
        尝试:
            如果浮动(self.first_value.text())212:
                self.first_value.setText("212")

            self.second_value.setText("答案")

            结果 = round((float(self.first_value.text()) - 32) * (5 / 9), 3)
            self.second_value.setText(str(result))

            self.launch = "第二"
        除了:
            self.second_value.setText("无效输入!")

    def make_far(self):
        尝试:
            如果浮动(self.first_value.text())100:
                self.first_value.setText("100")

            self.second_value.setText("答案")

            结果 = round((float(self.first_value.text()) * (9 / 5)) + 32, 3)
            self.second_value.setText(str(result))

            self.launch = "第二"
        除了:
            self.second_value.setText("无效输入!")

    def fill_thermometer(self, qp): # 重要方法!
        col = QColor(0, 0, 0)
        col.setNamedColor('#d4d4d4')
        qp.setPen(col)

        qp.setBrush(QColor(109, 160, 201))
        rect_lenght = round(float(self.second_value.text()))
        qp.drawRect(17, 157, rect_lenght, 21)


类主窗口(QMainWindow):
    def __init__(self):
        超级().__init__()

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.build_skeleton_with_basic_settings()
        self.create_and_connect_grid()

    def build_skeleton_with_basic_settings(self):
        self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
        self.setWindowTitle(WINDOW_NAME)
        self.setWindowIcon(QIcon(WINDOW_ICON_NAME))

    def create_and_connect_grid(self):
        self.main_grid = QGridLayout(self.centralWidget)
        form_builder_object = FormBuilder()
        self.main_grid.addWidget(form_builder_object, 0, 0, Qt.AlignTop)


如果 __name__ == '__main__':
    应用程序 = QApplication(sys.argv)
    例如 = 主窗口()
    ex.show()
    sys.exit(app.exec_())

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2022-04-18T06:43:42Z2022-04-18T06:43:42Z

    我试着为你做点什么,如果你不睡觉-试试。

    import sys
    from PyQt5.QtWidgets import QWidget, QPushButton, QLabel, QHBoxLayout, \
        QVBoxLayout, QLineEdit, QFormLayout, \
        QGroupBox, QMainWindow, QGridLayout, QApplication
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QFont, QPainter, QColor, QPen, QIcon
    
    
    WINDOW_HEIGHT = 210
    WINDOW_WIDTH = 300
    WINDOW_NAME = 'Температура'
    WINDOW_ICON_NAME = 'im.png'                    # 'Images\\main_logo.png'
    
    MAIN_FONT = 'Times'
    FONT_HEADER_SIZE = 11                          # 13
    FONT_BODY_SIZE = 8
    
    
    class FormBuilder(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.launch = "first"                                    # ваша проблемнаяя переменная !
    
            self.create_all_forms()
            self.fill_forms()
            self.create_layers()
    
        def create_all_forms(self):
            self.heading_label = QLabel()
            self.entering_label = QLabel()
    
            self.first_value = QLineEdit(placeholderText="Значение T")
            self.second_value = QLineEdit(placeholderText="Ответ")  # ваша проблемнаяя переменная !      
    
            self.celc_button = QPushButton("К Цельсия")
            self.far_button = QPushButton("К Фаренгейт")
    
            self.first_draw_label = QLabel(" ")
            self.second_draw_label = QLabel(" ")
    
        def fill_forms(self):
            self.heading_label.setText("Преобразование температуры C-F")
            self.heading_label.setFont(QFont(MAIN_FONT, FONT_HEADER_SIZE, QFont.Bold))
            self.entering_label.setText("Температурное значение")
            self.entering_label.setFont(QFont(MAIN_FONT, FONT_HEADER_SIZE))
            self.second_value.setDisabled(True)
            self.celc_button.setMinimumWidth(125)
            self.celc_button.clicked.connect(self.make_celc)
            self.far_button.clicked.connect(self.make_far)
            self.first_draw_label.resize(500, 500)
    
        def create_layers(self):
            main_layout = QVBoxLayout(self)
    
            heading_label = QHBoxLayout()
            heading_label.addWidget(self.heading_label)
            main_layout.addLayout(heading_label)
    
            self.first_groupbox = QGroupBox(self.entering_label.text())
            self.first_groupbox.setStyleSheet('''
                        QGroupBox {
                            margin-top: 2ex;
                        }
                        QGroupBox:enabled {
                            border: 3px solid gray;
                            border-radius: 5px;
                        }
                        QGroupBox::title {
                            subcontrol-origin: margin;
                            left: 3ex;
                        }
                    ''')
            first_groupbox_layout = QVBoxLayout(self.first_groupbox)
            first_groupbox_layout.addWidget(self.first_value)
            first_groupbox_layout.addWidget(self.second_value)
            main_layout.addWidget(self.first_groupbox)
    
            button_line = QFormLayout()
            button_line.addRow(self.celc_button, self.far_button)
            main_layout.addLayout(button_line)
    
            first_draw_label = QHBoxLayout()
            first_draw_label.addWidget(self.first_draw_label)
            main_layout.addLayout(first_draw_label)
    
            second_draw_label = QHBoxLayout()
            second_draw_label.addWidget(self.second_draw_label)
            main_layout.addLayout(second_draw_label)
    
        def paintEvent(self, e):                                      # важный метод!
            qp = QPainter()
            qp.begin(self)
            
            qp.setBrush(QColor(112, 106, 104))                               # +++
            qp.drawRoundedRect(10, 150, 260, 35, 5, 5)                       # +++        
            qp.setBrush(QColor(194, 189, 186))                               # +++
            qp.drawRect(15, 155, 250, 25)                                    # +++ 
            
            if self.first_value.text() and self.second_value.text():         # +++ !!! ВАЖНО
                if self.launch == "first":
                    self.draw_thermometer(qp)
                elif self.launch == "second":
                    self.fill_thermometer(qp)
            qp.end()
    
        def make_celc(self):
            try:
    # ?                                            vv <----- что это ???        
    # ?           if float(self.first_value.text())  212:
                if float(self.first_value.text()) == 212:
                    self.first_value.setText("212")
    
    # ?           self.second_value.setText("Ответ")         # placeholderText   ???
    
                result = round((float(self.first_value.text()) - 32) * (5 / 9), 3)
                self.second_value.setText(str(result))
    
    # ?           self.launch = "second"                          # ???
                self.launch = "first"                                                  # +++
                
            except:
    # ?           self.second_value.setText("Неправильный ввод!") # ???
                self.second_value.clear()                                              # +++
                self.second_value.setPlaceholderText("Неправильный ввод!")             # +++
    
            self.update()                                                              # +++ ВАЖНО !!!
            
        def make_far(self):
            try:
    # ??                                            vv  <<------ что это ?        
    # ??           if float(self.first_value.text())  100:
                if float(self.first_value.text()) == 100:
                    self.first_value.setText("100")
    
    #?            self.second_value.setText("Ответ")
    
                result = round((float(self.first_value.text()) * (9 / 5)) + 32, 3)
                self.second_value.setText(str(result))
                self.launch = "second"
            except:
    #            self.second_value.setText("Неправильный ввод!")
                self.second_value.clear()                                                # +++
                self.second_value.setPlaceholderText("Неправильный ввод!")               # +++
    
            self.update()                                                              # +++ ВАЖНО !!!
    
        def draw_thermometer(self, qp):                            # важный метод!
            col = QColor(0, 0, 0)                        
            col.setNamedColor('#d4d4d4')
            qp.setPen(col)
            ''' # НЕТ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
            print(f'    def draw_thermometer(self, qp): {qp}')  
            qp.setBrush(QColor(112, 106, 104))
            qp.drawRoundedRect(10, 150, 260, 35, 5, 5)
            qp.setBrush(QColor(194, 189, 186))
            qp.drawRect(15, 155, 250, 25)
            ''' # НЕТ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
            qp.setBrush(QColor(10, 216, 20))
            rect_lenght = round(float(self.second_value.text()))
            qp.drawRect(17, 157, rect_lenght, 21)
            
    # ??        self.launch = 2     <<------ что это ? 
            
        def fill_thermometer(self, qp):                             # важный метод!
            col = QColor(0, 0, 0)
            col.setNamedColor('#d4d4d4')
            qp.setPen(col)
    
    #        qp.setBrush(QColor(109, 160, 201))
            qp.setBrush(QColor(10, 16, 201))
            rect_lenght = round(float(self.second_value.text()))
            qp.drawRect(17, 157, rect_lenght, 21)
    
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.centralWidget = QWidget()
            self.setCentralWidget(self.centralWidget)
    
            self.build_skeleton_with_basic_settings()
            self.create_and_connect_grid()
    
        def build_skeleton_with_basic_settings(self):
            self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
            self.setWindowTitle(WINDOW_NAME)
            self.setWindowIcon(QIcon(WINDOW_ICON_NAME))
    
        def create_and_connect_grid(self):
            self.main_grid = QGridLayout(self.centralWidget)
            form_builder_object = FormBuilder()
            self.main_grid.addWidget(form_builder_object, 0, 0, Qt.AlignTop)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = MainWindow()
        ex.show()
        sys.exit(app.exec_())
    

    在此处输入图像描述 在此处输入图像描述

    • 3

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5