python - 如何使用 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):
- 总金额应在 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,并且应仅手动设置剩余可用百分比。它可以使用也可以不使用。
- 如果 self.percentage1 或 self.percentage2 的值为 !=0.00,则 self.total_amount(spin box) 应设置为 setReadonly(True)
- 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_())
解决方案
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_())
推荐阅读
- angular - 隔离测试:如何测试 Observable 的回调
- python - 如何在更改列类型更改时检测行索引以查找错误发生的位置?
- java - Jackson:序列化对象时从映射字段中提取键、值对
- sql-server - 我的 Api 中有关于转换十进制类型的错误
- android - android 应用程序的 Intent url 不起作用
- powershell - 通过 PowerShell 脚本中的 DHCP 服务器检索客户端的 IP 地址及其 MAC 地址
- mysql - 使用 nodejs/mysql 时出现奇怪的慢查询条目
- python - 将具有多级嵌套列表的不规则列表转换为列表列表
- class - 如何将自定义 CSS 类添加到
- AEM RTE 组件
- python - Blender 作为 Python 模块 Mac