python - 如何在 QTreeWidget 整数/浮点数中创建特定列,以便用户不能输入任何字母或符号而不是整数/浮点数?
问题描述
我正在使用 QTreeWidget 的 PyQt5 中制作一个 GUI。我希望特定列是仅整数列。用户不能在其中输入任何非整数项。我看到了一些使用 QVariant 的方法,但它似乎不能满足我的要求。
这是我发现的!.但这在我看来就像从后端而不是从用户端设置数据。
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(478, 320)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget)
self.treeWidget.setAlternatingRowColors(True)
self.treeWidget.setObjectName("treeWidget")
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
item_1.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEditable|QtCore.Qt.ItemIsDragEnabled|QtCore.Qt.ItemIsUserCheckable|QtCore.Qt.ItemIsEnabled)
self.verticalLayout.addWidget(self.treeWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 478, 20))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.treeWidget.headerItem().setText(0, _translate("MainWindow", "Some other data"))
self.treeWidget.headerItem().setText(1, _translate("MainWindow", "Only Integers"))
__sortingEnabled = self.treeWidget.isSortingEnabled()
self.treeWidget.setSortingEnabled(False)
self.treeWidget.topLevelItem(0).setText(0, _translate("MainWindow", "Text"))
self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "Sub Text"))
self.treeWidget.setSortingEnabled(__sortingEnabled)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
这是代码和图像。请让我知道我应该对代码进行哪些更改以实现我的目标。提前致谢。
解决方案
您必须在第二列中建立一个代表作为编辑器QSpinBox
:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
# ...
class IntegerDelegate(QtWidgets.QStyledItemDelegate):
def createEditor(self, parent, option, index):
editor = QtWidgets.QSpinBox(parent)
editor.setFrame(False)
editor.setMinimum(-2147483648)
editor.setMaximum(2147483647)
editor.setSizePolicy(
QtWidgets.QSizePolicy.Ignored, editor.sizePolicy().verticalPolicy()
)
return editor
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
delegate = IntegerDelegate(self.treeWidget)
self.treeWidget.setItemDelegateForColumn(1, delegate)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
更新:
class DoubleDelegate(QtWidgets.QStyledItemDelegate):
def createEditor(self, parent, option, index):
editor = QtWidgets.QDoubleSpinBox(parent)
editor.setFrame(False)
editor.setMinimum(-1.7976931348623157e+308)
editor.setMaximum(1.7976931348623157e+308)
editor.setSizePolicy(
QtWidgets.QSizePolicy.Ignored, editor.sizePolicy().verticalPolicy()
)
return editor
推荐阅读
- r - 输出表 - 加权 t 检验
- excel - 如何使 Excel Power Query 根据工作表中单元格的值过滤数据?
- amazon-web-services - 如何在 AWS Elastic Beanstalk 上部署的 Docker Multi Container 上扩展每个容器
- php - 同步基本站点登录和 Wordpress 登录以进行帐户管理
- c++ - const全局对象的构造函数主体执行?
- apache-kafka - 如何高效查询Kafka Topics?
- python - 无意义的空间名词
- php - 将页面视图添加到 API 的 WordPress 功能
- windows - Rsync > 不同步 Windows 快捷方式的内容
- c - 选择较小的错误不正确的 Printf() 语句:更少的参数与额外的参数