[PyQt] Help with QTableView

Catriona Johnson catriona.johnson at gmail.com
Wed Jan 30 04:14:36 GMT 2008


Thanks for that and sorry for taking a while to get this but I tried
what you said and I still can't edit the checkboxes. I can howerver
edit the space to the right of the checkboxes which I don't want to
do. Updated setData method below:

def setData(self, index, value, role):
		if index.isValid():
			record = self.record(index.row())
			if role == Qt.CheckStateRole:
				if value == Qt.Checked:
					record.setValue(index.column(), QVariant(1))
				else:
					record.setValue(index.column(), QVariant(0))
				self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index, index)
				return True
		return False

On 30/01/2008, Brian Kelley <kelley at eyesopen.com> wrote:
> For both the data and setdata method, checkboxes are only retrieved or
> set for the CheckStateRole.
>
> Simply add an:
>
>   if role == Qt.CheckStateRole:
>      ...
>
> to your setData method and you should be off to the races.
>
> On Jan 29, 2008, at 5:22 PM, Catriona Johnson wrote:
>
> > Thanks Brian
> >
> > I tried that and the checkboxes are showing the right value but I am
> > unable to edit the checkbox only the datarole. What am I doing wrong??
> > Code sample below.
> >
> > from PyQt4.QtGui import *
> > from PyQt4.QtSql import *
> > from PyQt4.QtCore import *
> > import sys
> >
> > class MyModel(QSqlRelationalTableModel, QStandardItemModel):
> >       def data(self, index, role=Qt.DisplayRole):
> >               qv = QSqlRelationalTableModel.data(self, index, role)
> >               if not index.isValid():
> >                       return QVariant()
> >               elif index.column() in [1]:
> >                       if role == Qt.CheckStateRole:
> >                               it = QSqlRelationalTableModel.data(self, index, 0)
> >                               if it.toInt()[0] == 1:
> >                                       return QVariant(Qt.Checked)
> >                               else:
> >                                       return QVariant(Qt.Unchecked)
> >                       else:
> >                               return QVariant()
> >               elif role == Qt.DisplayRole:
> >                       return qv
> >               else:
> >                       return QVariant()
> >
> >       def flags(self, index):
> >               if index.column() in [1]:
> >                       return Qt.ItemIsEnabled|Qt.ItemIsUserCheckable|
> > Qt.ItemIsSelectable|Qt.ItemIsEditable
> >               else:
> >                       return Qt.ItemIsEnabled|Qt.ItemIsEditable|Qt.ItemIsSelectable
> >
> >       def setData(self, index, value, role):
> >               if index.isValid():
> >                       record = self.record(index.row())
> >                       if role == Qt.EditRole:
> >                               if value == Qt.Checked:
> >                                       record.setValue(index.column(), QVariant(1))
> >                               else:
> >                                       record.setValue(index.column(), QVariant(0))
> >                               self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index,
> > index)
> >                               return True
> >               return False
> >
> > class Form(QDialog):
> >       def __init__(self, parent=None):
> >               super(Form,self).__init__(parent)
> >               self.timeSeriesModel = MyModel(self) # links data to data aware
> > widget
> >               self.timeSeriesModel.setTable("TimeSeries")
> >               self.timeSeriesModel.setRelation(2, QSqlRelation("AnimalMovement",
> > "AnimalMovementId", "AnimalMovement"))
> >               self.timeSeriesModel.setData
> >               self.timeSeriesModel.select()
> >               self.tvTest = QTableView(self)
> >               self.tvTest.setGeometry(QRect(10,0,1400,200))
> >               self.tvTest.setModel(self.timeSeriesModel)
> >               self.tvTest.setSelectionMode(QTableView.SingleSelection)
> >               self.tvTest.setSelectionBehavior(QTableView.SelectRows)
> >               self.tvTest.setItemDelegate(QSqlRelationalDelegate(self.tvTest))
> >
> > def createConnection():
> >       db = QSqlDatabase.addDatabase("QSQLITE")
> >       db.setDatabaseName(":memory:")
> >       if not db.open():
> >               return False
> >       query = QSqlQuery()
> >
> >       query.exec_("CREATE TABLE AnimalMovement("
> >                               "AnimalMovementId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT
> > NULL, "
> >                               "AnimalMovement VARCHAR(20) NOT NULL"
> >                               ")")
> >       query.prepare("INSERT INTO AnimalMovement(AnimalMovement) VALUES
> > (?)")
> >       animalMovementData = ['Swim to', 'Swim away', 'Swim parallel']
> >
> >       for animalMovement in animalMovementData:
> >               query.addBindValue(QVariant(QString(animalMovement)))
> >               query.exec_()
> >
> >       query.exec_("CREATE TABLE TimeSeries("
> >                               "TimeSeriesId INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "
> >                               "First INTEGER NULL, "
> >                               "AnimalMovementId INTEGER NULL CONSTRAINT fk_animal_movement
> > REFERENCES AnimalMovement(AnimalMovementId) "
> >                               ")")
> >       query.prepare("INSERT INTO TimeSeries(First, AnimalMovementId)
> > VALUES (?, ?)")
> >       timeSeriesData = [[1, 1], [0, 2], [1, 2]]
> >
> >       for first, animalMovementId  in timeSeriesData:
> >               query.addBindValue(QVariant(first))
> >               query.addBindValue(QVariant(animalMovementId))
> >               query.exec_()
> >       return True
> >
> > if __name__ == "__main__":
> >
> >       app = QApplication(sys.argv)
> >       if not createConnection():
> >               QMessageBox.warning(None, "Database", QString("Database error:
> > %l").arg(db.lastError().text()))
> >               sys.exit(1)
> >       form = Form()
> >       form.show()
> >       sys.exit(app.exec_())
> >
> >
> >
> > On 26/01/2008, Brian Kelley <kelley at eyesopen.com> wrote:
> >> in the model's data method:
> >>
> >> def data(index, role):
> >>  ...
> >>  if role == QtCore.Qt.CheckStateRole:
> >>     return QtCore.Qt.Checked # or UnChecked
> >>
> >> Note you can have a checkbox along with the datarole as well.
> >>
> >> On Jan 18, 2008, at 12:10 AM, Catriona Johnson wrote:
> >>
> >>> Hello
> >>>
> >>> How do I implement a checkbox in a QTableView column that
> >>> retreives/stores values in a database?
> >>>
> >>> Also, I have one model with columns say abc and I have two
> >>> QTableViews
> >>> of this model that show the columns in different orders - bca and
> >>> cab.
> >>> How do I change the column order in the QTableView?
> >>>
> >>> Thanks
> >>> _______________________________________________
> >>> PyQt mailing list    PyQt at riverbankcomputing.com
> >>> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
> >>
> >>
>
>


More information about the PyQt mailing list