QAbstractTableModel und QItemFlags

Alles rund um die Programmierung mit Qt
Antworten
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

QAbstractTableModel und QItemFlags

Beitrag von chrootdev »

Hallo,

ich habe ein problem mit dem letzten code ausschnitt, und zwar mit den flags. Wann wird das aufgerufen, überprüft bzw. benutzt oder sonstiges?

Könnte mir den ausschnitt bitte jemand etwas näher bringen? Ich habe den code aus den examples\itemviews\addressbook

Ich weiß das ich mit den flags das verhalten der zellen steuern kann, jedoch ist mir nicht klar wann was aufgerufen wird, bzw. wie ich das genau verwenden muss, weil ich z.b. nicht will, das alle zellen editierbar sind oder nur eine zelle eine checkbox hat usw.

Danke!

Code: Alles auswählen

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    
    if (index.row() >= listOfPairs.size() || index.row() < 0)
        return QVariant();
    
    if (role == Qt::DisplayRole) {
        QPair<QString, QString> pair = listOfPairs.at(index.row());
        
        if (index.column() == 0)
            return pair.first;
        else if (index.column() == 1)
            return pair.second;
    }
    return QVariant();
}

Code: Alles auswählen

bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
	if (index.isValid() && role == Qt::EditRole) {
		int row = index.row();
				
		QPair<QString, QString> p = listOfPairs.value(row);
		
		if (index.column() == 0)
			p.first = value.toString();
		else if (index.column() == 1)
			p.second = value.toString();
        else
            return false;
            
        listOfPairs.replace(row, p);
		emit(dataChanged(index, index));
		
        return true;
	}

	return false;
}

Code: Alles auswählen

Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::ItemIsEnabled;
    
    return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

flags() wird z.B. aufgerufen, wenn der Benutzer eine Zelle anklickt.

Hier ein Beispielcode um z.B. nur column(1) Editierbar zu machen:

Code: Alles auswählen

Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
  Qt::ItemFlags flags;

  if (index.isValid()) {
    if (index.column()==1) {
      flags|=Qt::ItemIsEnabled;
    }
    flags|=Qt::ItemIsSelectable;
    flags|=Qt::ItemIsEnabled;
  }

  return flags;
} 
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

upsala hat geschrieben:flags() wird z.B. aufgerufen, wenn der Benutzer eine Zelle anklickt.
Danke, genau das wollte ich wissen, und den rest muss ich also wie bei deinem code in der methode aufgrund des index steuern.

Danke!
Antworten