В PySide2, если я создаю QDoubleSpinBox и явно устанавливаю его свойство decimals
равным 2, а его свойство singleStep
равным 0,1, а затем изменяю его значение с помощью кнопок вверх/вниз, напечатанное значение иногда имеет гораздо более высокую точность.
Почему это так?
Хотя это не обязательно может быть проблемой для вычислений, выполняемых с этим значением, это может повлиять на работу пользователя:
В моем случае я хочу отключить QPushButton, если значение счетчика равно 0,0, и включить его в противном случае. В случае, если значение счетчика становится действительно близким к 0, кнопка (а также стрелка вниз счетчика) не отключаются, хотя читаемое число внутри счетчика говорит «0,00».
Что я делаю в данный момент, чтобы исправить пользовательский опыт:
int(self.spin.value()*100) > 0
вместо:
self.spin.value() > 0.0
Действительно ли это лучший способ сделать это?
Вот небольшой пример для воспроизведения нежелательного поведения:
import sys
from PySide2 import QtWidgets
class Window(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.spin = QtWidgets.QDoubleSpinBox(self)
self.spin.setDecimals(2)
self.spin.setSingleStep(0.1)
self.button = QtWidgets.QPushButton(self)
self.button.move(0, 40)
self.spin.valueChanged.connect(self.on_spin_value_change)
self.show()
def on_spin_value_change(self, value):
print(value)
self.button.setEnabled(value > 0.0)
app = QtWidgets.QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
Это пример вывода:
Редактировать: Нет, мой вопрос не сводится просто к тому, "как сравнивать числа с плавающей запятой в Python". Я попросил способ исправить взаимодействие с пользователем QDoubleSpinBox
es и объяснить, почему внутреннее представление значения отличается от видимого. Да, выбор другого способа сравнения чисел с плавающей запятой может решить проблему, но использование другого перегруженного сигнала является лучшим решением для меня - решение, о котором мне не сказали бы, если бы мой вопрос не был Зависит от Qt/PySide.