首页 > 解决方案 > 如何使用 QDoubleSpinBox 和 QLineEdit 限制 QDoubleSpinBox 的值?

问题描述

我有一个带有 5 个 QDoubleSpinBox 和 1 个 QLineEdit 的程序。

    self.total_amount = QtWidgets.QDoubleSpinBox()
    self.percentage1 = QtWidgets.QDoubleSpinBox()
    self.amount1 = QtWidgets.QDoubleSpinBox()
    self.percentage2 = QtWidgets.QDoubleSpinBox()
    self.amount2 = QtWidgets.QDoubleSpinBox()
    self.status_line = QtWidgets.QLineEdit()

我需要的概念是:

编辑(1):


  1. 总金额应在 self.percentage1 和 self.percentage2 的帮助下共享给 self.amount1 和 self.amount2。例如,如果 self.total_amount(spin box) 是 10.00,并且如果我在 self.percentage1(spin box) 上设置值 50.00(%) 设置 self.amount1(spin box) 是 5.00 罚款。但与此同时,应将限制设置为 self.percentage2(spin box),该限制应仅将剩余 50.00(%) 可用百分比的限制设置为 self.percentage2,并且应仅手动设置剩余可用百分比。它可以使用也可以不使用。

  1. 如果 self.percentage1 或 self.percentage2 的值为 !=0.00,则 self.total_amount(spin box) 应设置为 setReadonly(True)
  2. self.percentage1 和 self.percentage2 应该 setReadonly(True) if self.status_line != "" 怎么做。下面是我的示例代码
from PyQt5 import QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.total_amount = QtWidgets.QDoubleSpinBox()
        self.percentage1 = QtWidgets.QDoubleSpinBox()
        self.amount1 = QtWidgets.QDoubleSpinBox()
        self.percentage2 = QtWidgets.QDoubleSpinBox()
        self.amount2 = QtWidgets.QDoubleSpinBox()
        self.status_line = QtWidgets.QLineEdit()

        form_widget = QtWidgets.QWidget()
        form_layout = QtWidgets.QFormLayout(form_widget)
        form_layout.addRow("Total Amount", self.total_amount)
        form_layout.addRow("percentage 1%", self.percentage1)
        form_layout.addRow("Amount 1", self.amount1)
        form_layout.addRow("percentage 2%", self.percentage2)
        form_layout.addRow("Amount 2", self.amount2)
        form_layout.addRow("Status", self.status_line)

        form_widget.setFixedSize(form_widget.sizeHint())
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        hlay1 = QtWidgets.QHBoxLayout()
        hlay1.addWidget(form_widget)
        hlay1.addStretch()

        vboxlayout = QtWidgets.QVBoxLayout(central_widget)
        vboxlayout.addLayout(hlay1)
        self.resize(300, 300)
        ##
        self.amount1.setReadOnly(True)
        self.amount2.setReadOnly(True)
        ##
        self.percentage1.valueChanged.connect(self.percentage1_changed)
        
    def percentage1_changed(self):
        self.amount1.setValue((self.total_amount.value() / 100)* self.percentage1.value())

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

标签: python

解决方案


from PyQt5 import QtWidgets
from PyQt5 import QtCore

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.total_amount = QtWidgets.QDoubleSpinBox()
        self.percentage1 = QtWidgets.QDoubleSpinBox()
        self.amount1 = QtWidgets.QDoubleSpinBox()
        self.percentage2 = QtWidgets.QDoubleSpinBox()
        self.amount2 = QtWidgets.QDoubleSpinBox()
        self.status_line = QtWidgets.QLineEdit()

        form_widget = QtWidgets.QWidget()
        form_layout = QtWidgets.QFormLayout(form_widget)
        form_layout.addRow("Total Amount", self.total_amount)
        form_layout.addRow("percentage 1%", self.percentage1)
        form_layout.addRow("Amount 1", self.amount1)
        form_layout.addRow("percentage 2%", self.percentage2)
        form_layout.addRow("Amount 2", self.amount2)
        form_layout.addRow("Status", self.status_line)

        form_widget.setFixedSize(form_widget.sizeHint())
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        hlay1 = QtWidgets.QHBoxLayout()
        hlay1.addWidget(form_widget)
        hlay1.addStretch()

        vboxlayout = QtWidgets.QVBoxLayout(central_widget)
        vboxlayout.addLayout(hlay1)
        self.resize(300, 300)
        ##
        self.amount1.setReadOnly(True)
        self.amount2.setReadOnly(True)

    ##########################################################################################
        #clear control for disable changed functions
        self.clear_control = 0

        #set available range for percentage2
        self.percentage2.setMaximum(40)
        
        #changed functions
        self.percentage1.valueChanged.connect(self.percentage1_changed)
        self.percentage2.valueChanged.connect(self.percentage2_changed)
        self.status_line.textChanged.connect(self.status_change)
        
    def status_change(self):
        self.total_amount.setReadOnly(True)
        self.percentage1.setReadOnly(True)
        self.percentage2.setReadOnly(True)

    def percentage1_changed(self):
        #if dont press key escape
        if self.clear_control == 0:
            self.amount1.setValue((self.total_amount.value() / 100)* self.percentage1.value())

            #for set ReadOnly
            self.control_percentage()

    def percentage2_changed(self):
        #if dont press key escape
        if self.clear_control == 0:
            self.amount2.setValue((self.total_amount.value() / 100)* self.percentage2.value())

            #for set ReadOnly
            self.control_percentage()

    def control_percentage(self):
        #percentage1 or percentage2 is changed
        if self.percentage1.value() != 0 or self.percentage2.value() != 0:
            #and total amount is not zero
            if self.total_amount.value() != 0:
                self.total_amount.setReadOnly(True)

    #key press for success and cancel ==> return-enter key and escape key
    def keyPressEvent(self, event):

        #return-enter press
        if event.key() in [QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter]:
            self.status_line.setText("Success :)")

        #escape press
        if event.key() == QtCore.Qt.Key_Escape:
            self.clear_control = 1# disable percentage_change functions for set Zero

            self.total_amount.setValue(0)
            self.percentage1.setValue(0)
            self.amount1.setValue(0)
            self.percentage2.setValue(0)
            self.amount2.setValue(0)
            self.status_line.clear()

            #clear setReadOnly
            self.total_amount.setReadOnly(False)
            self.percentage1.setReadOnly(False)
            self.percentage2.setReadOnly(False)

            self.clear_control = 0# reenable percentage_change functions
    ##############################################################################################

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

推荐阅读