Hello,

I don't know how to get numeric data from my model to my GUI, if they aren't floats but decimal.Decimal. In the following example the last column of the view and the last QLineEdit of the form both stay empty. The model data are printed to the console and it can be seen that the model contains the correct data for the last column and that they have the right type. But the GUI doesn't show them. What should I change?

Thanks for hints,
Sibylle


# modeltest.py

import sys
import decimal
import datetime
from PyQt4 import QtCore
from PyQt4 import QtGui

RAWDATA = [(1, "First", datetime.date(2012, 7, 15), 1.25, decimal.Decimal(2.5)),
           (2, "Second", datetime.date(2011, 6, 10), 3.77,
            decimal.Decimal(7.54)),
           (3, "Third", datetime.date(2010, 5, 27), 5.03,
            decimal.Decimal(10.06))]

class MyDialog(QtGui.QDialog):

    def __init__(self, data, parent=None):
        super(MyDialog, self).__init__(parent)
        self.myModel = self.setupModel(data)
        self.showModelData()
        view = self.setupView()
        form = self.setupForm()
        view.selectionModel().currentRowChanged.connect(
            self.mapper.setCurrentModelIndex)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(view)
        layout.addWidget(form)
        self.setLayout(layout)
        #self.mapper.toFirst()
        view.selectRow(0)

    def setupModel(self, data):
        md = QtGui.QStandardItemModel(len(data), 5)
        md.setHorizontalHeaderLabels(["Int", "String", "Date", "Float",
                                      "Decimal"])
        for (i, row) in enumerate(data):
            # Integer
            item = QtGui.QStandardItem()
            item.setData(row[0], QtCore.Qt.EditRole)
            md.setItem(i, 0, item)
            # String
            md.setItem(i, 1, QtGui.QStandardItem(row[1]))
            item = QtGui.QStandardItem()
            # First try: use datetime.date as is. Result:
            # Date column in view empty, QDateEdit shows 1.1.2000
            # item.setData(row[2], QtCore.Qt.EditRole)
            # Second try: convert to QDate via string
            dt = QtCore.QDate.fromString(row[2].isoformat(),
                                         QtCore.Qt.ISODate)
            item.setData(dt, QtCore.Qt.EditRole)
            md.setItem(i, 2, item)
            # Float
            item = QtGui.QStandardItem()
            item.setData(row[3], QtCore.Qt.EditRole)
            md.setItem(i, 3, item)
            # Decimal
            item = QtGui.QStandardItem()
            item.setData(row[4], QtCore.Qt.EditRole)
            md.setItem(i, 4, item)
        return md

    def setupView(self):
        view = QtGui.QTableView()
        view.setModel(self.myModel)
        view.setAlternatingRowColors(True)
        view.setSelectionMode(QtGui.QTableView.SingleSelection)
        view.setSelectionBehavior(QtGui.QTableView.SelectRows)
        view.resizeColumnsToContents()
        return view

    def setupForm(self):
        # set up the widgets
        intBox = QtGui.QSpinBox()
        strEdit = QtGui.QLineEdit()
        dateEdit = QtGui.QDateEdit()
        floatEdit = QtGui.QLineEdit()
        decEdit = QtGui.QLineEdit()
        # set up the mapper
        self.mapper = QtGui.QDataWidgetMapper(self)
        self.mapper.setModel(self.myModel)
        self.mapper.addMapping(intBox, 0)
        self.mapper.addMapping(strEdit, 1)
        self.mapper.addMapping(dateEdit, 2)
        self.mapper.addMapping(floatEdit, 3)
        self.mapper.addMapping(decEdit, 4)
        # set up the layout
        form = QtGui.QWidget()
        layout = QtGui.QFormLayout()
        layout.addRow("Int:", intBox)
        layout.addRow("String:", strEdit)
        layout.addRow("Date:", dateEdit)
        layout.addRow("Float:", floatEdit)
        layout.addRow("Decimal:", decEdit)
        form.setLayout(layout)
        return form

    def showModelData(self):
        print("--- Model data: ---")
        for i in range(self.myModel.rowCount()):
            inr = self.myModel.data(self.myModel.index(i, 0))
            desc = self.myModel.data(self.myModel.index(i, 1))
            day = self.myModel.data(self.myModel.index(i, 2))
            fl = self.myModel.data(self.myModel.index(i, 3))
            dec = self.myModel.data(self.myModel.index(i, 4))
print("{0}: {1} / {2}, {3}, {4} ({5})".format(inr, desc, day, fl,
                                                          dec, type(dec)))
        print("--- End of model data ---")

app = QtGui.QApplication(sys.argv)
dia = MyDialog(RAWDATA)
dia.show()
app.exec_()
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to