如何在 QTreeWidget 整数/浮点数中创建特定列,以便用户不能输入任何字母或符号而不是整数/浮点数? [英] how to make a particular column in QTreeWidget integer/Float, such that the user can't enter any alphabets or symbols instead of integers/Floats?

查看:61
本文介绍了如何在 QTreeWidget 整数/浮点数中创建特定列,以便用户不能输入任何字母或符号而不是整数/浮点数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在 PyQt5 中制作一个使用 QTreeWidget 的 GUI.我想要一个特定的列是整数列.用户不应该能够在其中输入任何非整数项.我看到一些使用 QVariant 的方法,但它似乎不能满足我的要求.

这是我

这是代码和图像.请让我知道我应该在代码中进行哪些更改以实现我的目标.提前致谢.

解决方案

您必须在第二列中建立一个委托,该委托有一个 QSpinBox 作为编辑器:

from PyQt5 import QtCore, QtGui, QtWidgets类 Ui_MainWindow(对象):# ...类IntegerDelegate(QtWidgets.QStyledItemDelegate):def createEditor(self, parent, option, index):编辑器 = QtWidgets.QSpinBox(parent)editor.setFrame(False)editor.setMinimum(-2147483648)editor.setMaximum(2147483647)editor.setSizePolicy(QtWidgets.QSizePolicy.Ignored, editor.sizePolicy().verticalPolicy())返回编辑器类 MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.setupUi(self)委托 = IntegerDelegate(self.treeWidget)self.treeWidget.setItemDelegateForColumn(1, 委托)如果 __name__ == "__main__":导入系统app = QtWidgets.QApplication(sys.argv)w = 主窗口()w.show()sys.exit(app.exec_())

更新:

class DoubleDelegate(QtWidgets.QStyledItemDelegate):def createEditor(self, parent, option, index):编辑器 = QtWidgets.QDoubleSpinBox(parent)editor.setFrame(False)editor.setMinimum(-1.7976931348623157e+308)editor.setMaximum(1.7976931348623157e+308)editor.setSizePolicy(QtWidgets.QSizePolicy.Ignored, editor.sizePolicy().verticalPolicy())返回编辑器

I am making a GUI in PyQt5 which uses QTreeWidget. I want a particular column to be integer only column. The user shouldn't be able to enter any non integer item in it. I saw some methods using QVariant but it doesn't seem to fullfill my requirement.

Here is what I found! .But this seems to me like setting the data from the back-end not from the user side.

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

Here is code and the image. Please let me know what changes should i make in the code to achieve my objective. Thanks in advance.

解决方案

You have to establish a delegate in the second column that has as editor a 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_())

Update:

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

这篇关于如何在 QTreeWidget 整数/浮点数中创建特定列,以便用户不能输入任何字母或符号而不是整数/浮点数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆