Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt - Маски ввода, делегаты, и ячейки [RSS Feed]

#1 Июнь 24, 2012 23:33:18

Serbis
От:
Зарегистрирован: 2012-02-13
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - Маски ввода, делегаты, и ячейки

Имеется таблица, в одном из столбцов необходимо вести контроль правильности ввода данных путем применения масок. Для этого каждому нужному итему в таблице был присвоен делегат, в котором был переопределен метод 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 интегрироваться в ячейку, а не вылезать в отдельном окне?



Офлайн

#2 Июнь 25, 2012 09:36:36

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt - Маски ввода, делегаты, и ячейки

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

Отредактировано reclosedev (Июнь 25, 2012 09:37:06)

Офлайн

#3 Сен. 8, 2012 09:56:21

verstal4ik
От: СПб
Зарегистрирован: 2012-07-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - Маски ввода, делегаты, и ячейки

Недавно делал похожую таблицу:

#!/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 (Сен. 8, 2012 09:57:22)

Офлайн

#4 Сен. 8, 2012 14:05:12

verstal4ik
От: СПб
Зарегистрирован: 2012-07-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - Маски ввода, делегаты, и ячейки

Вот только не пойму, как сделать маску, чтоб числа можно было написать от 0.0000 до 1.0000 или 0.9999

Офлайн

#5 Сен. 9, 2012 09:19:26

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt - Маски ввода, делегаты, и ячейки

verstal4ik
Вот только не пойму, как сделать маску, чтоб числа можно было написать от 0.0000 до 1.0000 или 0.9999
Зачем маски? Есть QDoubleValidator

Офлайн

  • Начало
  • » GUI
  • » PyQt - Маски ввода, делегаты, и ячейки[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version