QPushButton 不会将 QDoubleSpinBox 值传递给具有 2 个或更多选项卡的同一类中的函数

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

背景

我想创建一个接口来控制电源电压。我用 PyQt5 设计了一个界面,其中包含我编写电压的所有字段,以及我需要应用电压、检查电压等的按钮。我想要几张桌子。这个界面看起来像这样。

enter image description here

我使用了

QDoubleSpinBoxes
QPushButton
,我希望当按下按钮时,旋转框中的值会传递到实际施加电压的函数。从那里开始,它依赖于我没有包含的
nidaqmx
库,但使用
print()
来实现它们的位置。在程序中,所有函数都在一个类中。 ui 的一个功能,以及一些其他要应用、检查等的功能。

问题

按钮不会将数值从旋转框传递到应应用或检查电压的功能。这很奇怪,因为我正在关注来自官方 Qt 网站的 这个示例,他们使用文档中的 这种方式 做了一些非常相似的事情(检查另一个示例)。

程序示例

我想提供一个清晰的 MWE,所以假设我有:一个旋转框,一个选项卡,只有两个按钮:检查和应用。

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

# Some functions needed in every tabs
class Commands:
    def __init__(self):
        self.AuxVolt    = [0]*16
        self.BufferVolt = [0]*16

    def check(self):
        print(f"DC01 = {self.DC01.value():.3f} V")
    def apply(self):
        print(f"Applying voltages")
        # Some functions from nidaqmx to control the instruments.

# Main UI class
class Ui_MainWindow(QtWidgets.QWidget,Commands): # object  QtWidgets.QTabWidget
    def __init__(self, parent: QtWidgets.QWidget = None):
        super().__init__(parent)
        
        self.setFixedSize(500, 400)
        tabs = QtWidgets.QTabWidget()       
        tabs.addTab(tab1UI(),"Tab 1")
        tabs.addTab(tab2UI(),"Tab 2")
        RESET = QtWidgets.QPushButton('RESET')
        RESET.setObjectName("RESET")
        RESET.clicked.connect(self.reset)
        
        main_layout = QtWidgets.QVBoxLayout()
        main_layout.addWidget(tabs)
        main_layout.addWidget(RESET)
        self.setLayout(main_layout)
        self.setWindowTitle("Voltage control")

class tab1UI(QtWidgets.QWidget,Commands):
    def __init__(self, parent: QtWidgets.QWidget):
        super().__init__(parent)
        main_layout = QtWidgets.QGridLayout()
                                    
        DC01 = QtWidgets.QDoubleSpinBox()
        DC01.setObjectName("DC01")
        DC02 = QtWidgets.QDoubleSpinBox()
        DC02.setObjectName("DC02")

        main_layout.addWidget(DC01,0,1)
        main_layout.addWidget(DC02,1,1)       
        CHECK = QtWidgets.QPushButton('CHECK')      
        CHECK.setObjectName("CHECK")
              
        main_layout.addWidget(CHECK,10,0)
        CHECK.clicked.connect(self.check)
        self.setLayout(main_layout)   

class tab2UI(QtWidgets.QWidget,Commands):
    def __init__(self, parent: QtWidgets.QWidget):
        super().__init__(parent)
        main_layout = QtWidgets.QGridLayout()
                                    
        DC01 = QtWidgets.QDoubleSpinBox()
        DC01.setObjectName("DC01")
        DC02 = QtWidgets.QDoubleSpinBox()
        DC02.setObjectName("DC02")

        main_layout.addWidget(DC01,0,1)
        main_layout.addWidget(DC02,1,1)       
        CHECK = QtWidgets.QPushButton('CHECK')      
        CHECK.setObjectName("CHECK")
              
        main_layout.addWidget(CHECK,10,0)
        CHECK.clicked.connect(self.check)
        self.setLayout(main_layout)   

# running the program
def main():
    app = QtWidgets.QApplication(sys.argv)
    ex = Ui_MainWindow()
    ex.show()
    sys.exit(app.exec_())
    
if __name__ == '__main__':
    main()

错误

如果我按下“检查”按钮,则会出现以下错误。

print(f"DC01 = {self.DC01.value():.3f} V")
                ^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'value'

按下任何按钮,我都会发现类似的错误,就好像

QDoubleSpinBoxes
没有正确传递给函数一样,即使我使用
self

python qt pyqt5
1个回答
0
投票

需要 使用

self
作为参数调用类

tabs.addTab(tab1UI(self),"Tab 1")
tabs.addTab(tab2UI(self),"Tab 2")

并将

QDoubleSpinBox
定义为

self.DC01 = QtWidgets.QDoubleSpinBox()
self.DC02 = QtWidgets.QDoubleSpinBox()

此外,无需使用

self
作为参数来调用小部件,例如
main_layout.addWidget(QtWidgets.QLabel(f'V',self),i,2)

© www.soinside.com 2019 - 2024. All rights reserved.