PyQt,如何检查数字数组是否具有特定长度

时间:2014-09-05 16:39:52

标签: postgresql pyqt

我将我的PyQt代码与我的PostgreSQL相关联,而在PostgreSQL中,我认为某些列是NUMERIC(11,0)类型,但现在我想将它限制为11位数字,因为NUMERIC(11,0)表示最多11位数。

class kirurg_GUI(QtGui.QWidget, Ui_kirurg_Widget):
       def __init__(self):
              QtGui.QWidget.__init__(self)
              self.setupUi(self)
              self.kirurg_Add_button.clicked.connect(self.insert_kirurg)

       def insert_kirurg(self):
              oib_kir = self.kirurg_oib_kir_lineEdit.text()
              if not oib_kir:
                     QtGui.QMessageBox.critical(self, 'Query error', 'oib_kir must not be empty')

              else: 
                     query = QSqlQuery()
                     status = query.exec("INSERT INTO kirurg (oib_kir, prezime, ime, adresa, broj_telefona)"
                                         "VALUES ('%s', '%s', '%s', '%s', '%s')" % (''.join(self.kirurg_oib_kir_lineEdit.text()),
                                                                                    ''.join(self.kirurg_prezime_lineEdit.text()),
                                                                                    ''.join(self.kirurg_ime_lineEdit.text()),
                                                                                    ''.join(self.kirurg_adresa_lineEdit.text()),
                                                                                    ''.join(self.kirurg_broj_telefona_lineEdit.text())))
                     if status is not True:
                            errorText = query.lastError().text()
                            QtGui.QMessageBox.critical(self, 'Query error', errorText)

                     else:
                            msgBox = QtGui.QMessageBox()
                            msgBox.setWindowTitle("Kirurg")
                            msgBox.setText("Data entered successfully")
                            msgBox.exec_()
                            kirurg.close()

这是我的代码的一部分,我在我的数据库中添加值。

这一行:

''.join(self.kirurg_oib_kir_lineEdit.text()

应该是11位数。我把它覆盖了最大尺寸和数字类型,但现在我想将它限制为精确的位数。

谢谢!

2 个答案:

答案 0 :(得分:2)

您只能使用QLineEdit.setInputMask (self, QString inputMask)或一组号码。请阅读here进行配置。

class kirurg_GUI (QtGui.QWidget, Ui_kirurg_Widget):
    def __init__ (self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)
        self.kirurg_Add_button.clicked.connect(self.insert_kirurg)
        maxLength = 11                                                      # <- Add length
        self.kirurg_oib_kir_lineEdit.setInputMask(('9' * maxLength) + ';_') # <- Set input mask
        self.kirurg_oib_kir_lineEdit.setMaxLength(maxLength)                # <- Set max length

    def insert_kirurg (self):
        oib_kir = self.kirurg_oib_kir_lineEdit.text()
        if not oib_kir:
            QtGui.QMessageBox.critical(self, 'Query error', 'oib_kir must not be empty')
        if len(str(oib_kir)) != self.kirurg_oib_kir_lineEdit.maxLength():                   # Check digit length
            QtGui.QMessageBox.critical(self, 'Query error', 'oib_kir must not be 11 diget') # Not 11 digit ? Error!
        else:
            query = QSqlQuery()
            status = query.exec("INSERT INTO kirurg (oib_kir, prezime, ime, adresa, broj_telefona)"
                                "VALUES ('%s', '%s', '%s', '%s', '%s')" % (''.join(self.kirurg_oib_kir_lineEdit.text()),
                                                                           ''.join(self.kirurg_prezime_lineEdit.text()),
                                                                           ''.join(self.kirurg_ime_lineEdit.text()),
                                                                           ''.join(self.kirurg_adresa_lineEdit.text()),
                                                                           ''.join(self.kirurg_broj_telefona_lineEdit.text())))
            if status is not True:
                errorText = query.lastError().text()
                QtGui.QMessageBox.critical(self, 'Query error', errorText)
            else:
                msgBox = QtGui.QMessageBox()
                msgBox.setWindowTitle("Kirurg")
                msgBox.setText("Data entered successfully")
                msgBox.exec_()
                kirurg.close()

答案 1 :(得分:1)

不能使用maxLength属性吗?

self.kirurg_oib_kir_lineEdit.setMaxLength(11);

或者您可以尝试添加这样的事件过滤器。也许我错了

class Filter(QtCore.QObject):
    def eventFilter(self, widget, event):
        if event.type() == QtCore.QEvent.FocusOut:
            getTxt = widget.text()
            if len(getTxt) < 11 or len(getTxt) > 11:
                 reply = QtGui.QMessageBox.critical(None, "Critical", 
                    'Value must be 11 numbers', QtGui.QMessageBox.Ok)
            return False
        else:
            return False

class LimitTest(QtGui.QWidget):
    def __init__(self, parent=None, total=20):
        super(LimitTest, self).__init__(parent)
        self._filter = Filter()
        self.newLimitTextEdit = QtGui.QLineEdit()
        self.normal = QtGui.QLineEdit()
        main_layout = QtGui.QGridLayout()
        main_layout.addWidget(self.newLimitTextEdit, 0, 0)
        main_layout.addWidget(self.normal, 0, 1)
        self.setLayout(main_layout)
        self.setWindowTitle('Test')
        self._active = False
        self.newLimitTextEdit.installEventFilter(self._filter)


app = QtGui.QApplication(sys.argv)
bar = LimitTest(total=101)
bar.show()
sys.exit(app.exec_())