On Wednesday 02 February 2005 06:31, Jim Bublitz wrote:
> On Tuesday 01 February 2005 18:44, Steve Taetzsch wrote:
>
> I've rewritten this once or twice and it still seems clear as mud,
> so please don't hesitate to ask for clarification. I don't have any
> sample code available that would be useful.

I created a small test app a few days back, it may provide as a usable 
starting point.

Phil: assimilate it, if you want..

Cheers,
Pete
#! /usr/bin/env python
#
# show validating int, float, date QTable items
#
# 2005-01-23    initial version    hp

import sys
from types import IntType, FloatType
from qt import *
from qttable import *

class TableItem(QTableItem):
    def __init__(self, table, et, text = ""):
        self.warnColor = QColor(230,124,127)
        QTableItem.__init__(self, table, et, text)

    def paint(self, p, cg, cr, selected):
        g = QColorGroup(cg)
        warn = False
        col = self.col()
        value = self.value()
        if col == 0:
            # date column
            if value != None and value < QDate.currentDate():
                warn = True
        else:
            # int or float column
            if value < 0:
                warn = True
        if warn:
            g.setColor(QColorGroup.Base, self.warnColor)
        QTableItem.paint(self, p, g, cr, selected)


class IntTableItem(TableItem):
    def __init__(self, table, value = None, bottom = None, top = None):
        self.top = top
        self.bottom = bottom
        TableItem.__init__(self, table, QTableItem.OnTyping)
        if value != None:
            self.setValue(value)
        # we do not want this item to be replaced
        self.setReplaceable(False)

    def value(self):
        return self.text().toInt()[0]

    def setValue(self, value):
        assert(type(value) == IntType)
        if self.bottom != None and value < self.bottom:
            value = int(self.bottom)
        if self.top != None and value > self.top:
            value = int(self.top)
        self.setText(str(value))

    def createEditor(self):
        le = QLineEdit(self.text(), self.table().viewport())
        ival = QIntValidator(le)
        if self.bottom != None:
            ival.setBottom(self.bottom)
        if self.top != None:
            ival.setTop(self.top)
        le.setValidator(ival)
        return le

    def setContentFromEditor(self, w):
        self.setValue(w.text().toInt()[0])


class FloatTableItem(TableItem):
    def __init__(self, table, value = None, bottom = None, top = None, decimals = None):
        self.decimals = decimals
        self.top = top
        self.bottom = bottom
        TableItem.__init__(self, table, QTableItem.OnTyping)
        if value != None:
            self.setValue(value)
        # we do not want this item to be replaced
        self.setReplaceable(False)

    def value(self):
        return self.text().toDouble()[0]

    def setValue(self, value):
        assert(type(value) in (IntType, FloatType))
        if self.bottom != None and value < self.bottom:
            value = float(self.bottom)
        if self.top != None and value > self.top:
            value = float(self.top)
        if self.decimals != None:
            self.setText("%.*f" % (self.decimals, value))
        else:
            self.setText(str(value))

    def createEditor(self):
        le = QLineEdit(self.text(), self.table().viewport())
        dval = QDoubleValidator(le)
        if self.bottom != None:
            dval.setBottom(self.bottom)
        if self.top != None:
            dval.setTop(self.top)
        if self.decimals != None:
            dval.setDecimals(self.decimals)
        le.setValidator(dval)
        return le

    def setContentFromEditor(self, w):
        self.setValue(w.text().toDouble()[0])


class DateTableItem(TableItem):
    def __init__(self, table, date = None):
        self.format = Qt.LocalDate
        TableItem.__init__(self, table, QTableItem.OnTyping)
        self.setValue(date)
        self._de = None
        # we do not want this item to be replaced
        self.setReplaceable(False)

    def value(self):
        return self.date

    def setValue(self, date):
        if date != None and date.isValid():
            self.date = date
            value = date.toString(self.format)
        else:
            self.date = None
            value = ""
        self.setText(value)

    def createEditor(self):
        date = self.value()
        if date != None and date.isValid():
            date = date.fromString(self.format)
        else:
            date = QDate.currentDate()
        self._de = QDateEdit(date, self.table().viewport())
        self._de.setAutoAdvance(True)
        return self._de

    def setContentFromEditor(self, w):
        # the user changed the value in the dateedit, so synchronize the
        # value of the item (its text), with the value of the dateedit
        if w.inherits("QDateEdit"):
            self.setValue(w.date())
            #self.setText(w.date().toString(self.format))
        else:
            TableItem.setContentFromEditor(self, w)


if __name__ == '__main__':
    ROWS = 10
    COLS = 3
    TOP = 99999
    BOTTOM = -99999
    DECIMALS = 3
    app = QApplication(sys.argv)
    t = QTable(ROWS, COLS)
    h = t.horizontalHeader()
    h.setLabel(0, "Date Editor")
    h.setLabel(1, "Int Validator")
    h.setLabel(2, "Float Validator")
    for i in range(ROWS):
        item = DateTableItem(t)
        t.setItem(i, 0, item)
        item = IntTableItem(t, i, BOTTOM, TOP)
        t.setItem(i, 1, item)
        item = FloatTableItem(t, i, BOTTOM, TOP, DECIMALS)
        t.setItem(i, 2, item)
    t.resize(t.sizeHint())
    t.show()
    app.setMainWidget(t)
    app.exec_loop()
_______________________________________________
PyKDE mailing list    [email protected]
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

Reply via email to