Mittlerweile habe ich herausgefunden, wie man mein Vorhaben umsetzen kann.
Im Model, bei mir eine Unterklasse von QAbstractTableModel, muss die Methode data(), die auch für das Liefern der Daten zuständig ist, auch den Parameter role auf Qt::CheckStateRole prüfen und dann entweder QVariant() für Spalten ohne Checkbox oder Qt::Checked oder Qt::Unchecked liefern.
Dieser Teil ist zuständig für das
Anzeigen der Checkboxen.
Allerdings möchte der Benutzer den Status bestimmt auch ändern können.
Dazu ist es nötig, flags() zu überschreiben, sodass eine Kombination der gewünschten Flags zusammen mit Qt::ItemIsUserCheckable geliefert wird.
Nun muss dem View aber auch noch ermöglicht werden, die Benutzereingaben anzunehmen und an das Model weiterzuleiten. Dafür muss beim Model noch die Methode setData() überschrieben werden. Ich gehe hierbei lediglich auf den Checkbox-Part ein.
In dieser Methode muss ebenfalls der Parameter role auf Qt::CheckStateRole überprüft werden und anschließend kann man die Checkbox beim übergebenen ModelIndex auf den in value gespeicherten Wert setzen. Wichtig ist, dass anschließend das Signal dataChanged() emittiert und true zurückgegeben wird. Beispiel:
Code: Alles auswählen
QVariant MyTableModel::data(const QModelIndex& index, int role) const
{
if (!index.isValid() ||
index.row() >= m_data->size())
return QVariant();
if (role == Qt::DisplayRole)
{
//hier die Daten zum Anzeigen zurückgeben
}
else if (role == Qt::CheckStateRole)
{
if (index.column() == 0)
//das Feld checkState ist vom Typ Qt::CheckState
return m_data->at(index.row()).checkState;
return QVariant();
}
return QVariant();
}
bool MyTreeModel::setData(const QModelIndex& index, const QVariant& value,
int role)
{
if (!index.isValid() || index.row() >= m_data->size())
return false;
if (role == Qt::CheckStateRole)
{
(*m_data)[index.row()].checkState = static_cast<Qt::CheckState>(value.toInt());
emit dataChanged(index, index);
return true;
}
return false;
}
inline Qt::ItemFlags MyTreeModel::flags(const QModelIndex& index) const
{
return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
}
Viel Spaß
MfG, Cedric