QAbstractItemModel als TreeModel mit Checkboxen erstellen



  • Hallo.
    Ich setzte mich gerade mit den Model/View-Klassen von Qt auseinander und benötige nun eure Hilfe.
    Ich möchte ein TreeModel von einem QAbstractItemModel ableiten und dann die TreeView mit Checkboxen versehen. Das Model konnte ich erstellen und es entspricht auch dem was ich möchte. Die Checkboxen konnte ich auch erstellen. Allerdings passiert nichts, wenn ich auf eine Checkbox klicke.

    So wie ich die Doku verstehe, muß ich das in der Methode setData() erledigen.

    Mein bisheriger Code in Ausschnitten: (TreeModel)

    QVariant TreeModel::data(const QModelIndex &index, int role) const
    {
        if (index.isValid() && role == Qt::DisplayRole) {
            Node *node = nodeForIndex(index);
            return node->data();
        }
    
        if (index.isValid() && role == Qt::CheckStateRole) {
            if (!hasChildren(index)) {
                return Qt::Unchecked;
            }
        }
        return QVariant();
    }
    
    Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
    {
        Qt::ItemFlags flags = QAbstractItemModel::flags(index);
        if (!hasChildren(index)) {
            flags |= Qt::ItemIsUserCheckable;
        }
        return flags;
    }
    
    bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
        Node *node = nodeForIndex(index);
        if (index.isValid() && role == Qt::CheckStateRole) {
    
            if (node->checked == true) {
                qDebug() << "Uncheched";
                node->checked = false;
            } else {
                node->checked =true;
                qDebug() << "Cheched";
            }
    
            emit dataChanged(index, index);
            return true;
        }
        emit dataChanged(index, index);
        return true;
    }
    

    Ein Item des TreeModel wird in Node abgespeichert.

    Ich muß irgendwie so etwas wie setCheckState() implementieren. Nur wie mache ich das? Wie setzte ich im Model die Checkbox auf aktiviert oder deaktiviert? Eigentlich müßte ich doch ein Signal oder ein Slot implementieren, oder?

    Vielen Dank



  • du verwendest in der setData methode nirgends den Wert, der in dem Parameter value steckt.
    Denn dass ist der Wert, welche vom View zum model gesendet wird zum setzten.

    Und data sollte eher Qt::Unchecked/Qt::Checked zurückliefern passend zum "checked-wertes" des items (für die CheckStateRole Rolle)

    Das sollte dann etwa so aussehen:

    QVariant TreeModel::data(const QModelIndex &index, int role) const
    {
    	if (index.isValid() && role == Qt::DisplayRole) {
    		Node *node = nodeForIndex(index);
    		return node->data();
    	}
    
    	if (index.isValid() && role == Qt::CheckStateRole) {
    		Node *node = nodeForIndex(index);
    		if (node->checked)) {
    			return Qt::Checked;
    		}
    		else {
    			return Qt::Unchecked;
    		}
    	}
    	return QVariant();
    }
    
    bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
    	if(!index.isValid())
    		return false;
    
    	Node *node = nodeForIndex(index);
    	if (role == Qt::CheckStateRole) {
    		bool boolVal = value.value<bool>();
    
    		node->checked = boolVal;
    		emit dataChanged(index, index);
    		return true;
    	}
    	emit dataChanged(index, index);
    	return true;
    }
    


  • Vielen Dank für die schnelle Hilfe. So läuft es einwandfrei.


Log in to reply