Найти - Пользователи
Полная версия: PyQt - Маски ввода, делегаты, и ячейки
Начало » GUI » PyQt - Маски ввода, делегаты, и ячейки
1
Serbis
Имеется таблица, в одном из столбцов необходимо вести контроль правильности ввода данных путем применения масок. Для этого каждому нужному итему в таблице был присвоен делегат, в котором был переопределен метод qtablewidgetitem ctrateEditor. В нем происходит создание объекта QLineEdit, в котором и происходит путем проверки индекса ячейки наложение соответствующей маски. Код.
class articleValidate(QtGui.QItemDelegate):
  def __init__(self, row, parent = None):
    QtGui.QItemDelegate.__init__(self, parent)
    
    self.row = row
      
  def createEditor(self, parent, options, index):
    editor = QtGui.QLineEdit()
    
    if self.row == 'Article':
      valid = QtGui.QIntValidator(1000000, 9999999, self)
    elif self.row == 'Name':
      rx = QtCore.QRegExp("(.{,80})")
      valid = QtGui.QRegExpValidator(rx, self)
    elif self.row == 'Size':
      rx = QtCore.QRegExp("(.{,30})")
      valid = QtGui.QRegExpValidator(rx, self)
.................................
editor.setValidator(valid)
    return editor
self.item_delegate = itemDelegate.articleValidate(0)
self.table.setItemDelegateForColumn(1, self.item_delegate)
self.connect(self.table, QtCore.SIGNAL('cellDoubleClicked(int, int)'), lambda row = 1:                         		 self.slot_cellClick(row))
def slot_cellClick(self, row):
    self.item_delegate.__init__(self.field[row])
В результате этого хитрого действия мы имеем праздник, каждая ячейка имеет свою маску ввода. Но есть момент. Во первых вызов QLineEdit приводит к тому, что при двойном клике по ячейке, происходит создание нового окна, с QLineEdit внутри, который имеет все повадки QTableWidgetItem, т. е. при закрытии окна или нажатии ввода он закрывается и данные переносятся в ячейку. Во вторых, ввиду того, что конструктор делегата вызывается для конкретного виджета по сигналу двойного клика, попытка просто начать ввод текста в ячейку приводит к крешу, так как QTableWidgetItem пытается обратиться к делегату без указания индекса ячейки. Можно начать конечно выкручиваться - заблокировать ячейку для ввода с клавиатуры, или отлавливать нажатия, и при оном определять позицию и вызывать конструктор делегата. Но мне кажется что может быть все проще, возможно ли заставить QLineEdit интегрироваться в ячейку, а не вылезать в отдельном окне?
reclosedev
Serbis
Во первых вызов QLineEdit приводит к тому, что при двойном клике по ячейке, происходит создание нового окна
Потому что не задается родитель для виджета
Serbis
возможно ли заставить QLineEdit интегрироваться в ячейку, а не вылезать в отдельном окне?
да
editor = QtGui.QLineEdit(parent)

Serbis
попытка просто начать ввод текста в ячейку приводит к крешу
Крэш, скорее всего, вызван тем, что __init__ делегата вызывается несколько раз.

Получение значения строки от сигнала doubleclick тоже несет проблемы, его нужно получать в createEditor через index.row().

Если все это исправить, должно работать (только мэппинг self.field row -> field нужно будет делегату передать).

http://doc.qt.nokia.com/4.7-snapshot/model-view-programming.html#delegate-classes
http://qt-project.org/doc/qt-5.0/itemviews-stardelegate.html
http://doc.qt.nokia.com/qq/qq24-delegates.html
verstal4ik
Недавно делал похожую таблицу:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# python2.7
#------------------------------------------------
import sys
from PyQt4 import QtCore, QtGui, uic
class LineEditDelegate(QtGui.QItemDelegate):
    def createEditor(self, parent, option, index):
        editor = QtGui.QLineEdit(parent)
        editor.setInputMask("B.0000") #маска
        return editor
class MainWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        uic.loadUi('testtable.ui', self) #таблица в дизайнере 5x4
        delegate = LineEditDelegate()
        self.table.setItemDelegate(delegate)
app = QtGui.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
verstal4ik
Вот только не пойму, как сделать маску, чтоб числа можно было написать от 0.0000 до 1.0000 или 0.9999
reclosedev
verstal4ik
Вот только не пойму, как сделать маску, чтоб числа можно было написать от 0.0000 до 1.0000 или 0.9999
Зачем маски? Есть QDoubleValidator
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB