首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将QDoubleSpinBox的值与QDoubleSpinBox和QLineEdit相结合?

如何将QDoubleSpinBox的值与QDoubleSpinBox和QLineEdit相结合?
EN

Stack Overflow用户
提问于 2021-03-25 12:48:13
回答 1查看 68关注 0票数 0

我有一个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(自旋盒)为10.00,如果我在self.percentage1(自旋盒)上设置值50.00(%),则设置self.amount1(自旋盒)的值为5.00。但同时,应该将限制设置为self.percentage2 (旋转框),将剩余的50.00(%)可用百分比限制为self.percentage2,并且只应手动设置剩余的可用百分比。它可以使用,也可以不使用。

如果

  1. self.total_amount(spin或self.percentage2具有!=0.00
  2. self.percentage1值,则为setReadonly(True),如果self.status_line !=“如何执行”,则self.percentage2应为setReadonly(True)。下面是我的示例代码

代码语言:javascript
复制
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_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-25 16:36:37

代码语言:javascript
复制
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_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66799840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档