user3030327
user3030327

Reputation: 451

How to restict Values of QDoubleSpinBox with QDoubleSpinBox and QLineEdit?

I have one program with 5 QDoubleSpinBox and 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()

My required concepts Are:

Edited (1):


  1. Total amount should be shared to self.amount1 and self.amount2 with the help of self.percentage1 and self.percentage2. For example if self.total_amount(spin box) is 10.00 and if i set the value 50.00(%) on self.percentage1(spin box) that is setting self.amount1(spin box) is 5.00 fine. But at that same time it should be set the restriction to self.percentage2(spin box) that should set a limit of remaining 50.00(%) available percentage to self.percentage2 only and it should be set the remaining available percentage manually only. It may be used or may not be used.

  1. self.total_amount(spin box) should be setReadonly(True) if self.percentage1 or self.percentage2 has values !=0.00
  2. self.percentage1 and self.percentage2 should be setReadonly(True) if self.status_line != "" How to do this. Below is my Example code
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_())

Upvotes: 0

Views: 91

Answers (1)

SimoN SavioR
SimoN SavioR

Reputation: 604

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_())

Upvotes: 1

Related Questions