Checkbox in QTreeView

Alles rund um die Programmierung mit Qt
Antworten
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Checkbox in QTreeView

Beitrag von mugi »

Hallo,
ich kann es bisher nicht schaffen die ersten 3 spalten meiner QTreeView mit Checkboxen zu versehen. Ich kann zwar checkboxen sehen, wenn ich aber drauf klicke passiert überhaupt nichts. (Sie lassen sich nicht deaktivieren!)
Hier sind die Funktionen die ich im QAbstractItemModel implimentiert habe :

Code: Alles auswählen

QModelIndex myModel::index ( int row, int column, const QModelIndex & parent) const
       {
             return createIndex(row, column);
       }
QModelIndex mytModel::parent ( const QModelIndex & index ) const
       {
            return QModelIndex();
       }
       
 int myModel::rowCount ( const QModelIndex & parent) const
       {
            return(r);
       }
int myModel::columnCount ( const QModelIndex & parent) const
       {
            return(c);
       }
bool myModel::hasChildren ( const QModelIndex & parent ) const
       {.....
       }
QVariant myModel::data ( const QModelIndex & index, int role) const
       {    int i = index.column();
            if(role == Qt::DisplayRole)
            {.....
            }
            if((i == 0 || i==1 || i=2 )&& (role==Qt::CheckStateRole ))
                    return  Qt::Checked;

            return QVariant();
       }
Qt::ItemFlags myModel::flags(const QModelIndex& index) const
       {
           if (i == 0 || i== 1 || i == 2)
               return Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsEnabled;
           return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
       } 
bool myModel::setData(const QModelIndex& index, const QVariant& value, int role)
        {
             return true;
        }
Vielen Dank im Voraus.
Zuletzt geändert von mugi am 10. Juli 2011 17:21, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du gibst doch bei data() immer Qt::Checked zurück, warum sollte dann deiner Meinung nach was anderes angezeigt werden?
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Vielen Dank für die schnelle Antwort.
Du hast natürlich Recht, ich weiß aber wirklich nicht wie ich dass verbessern kann!
Wenn ich in Data Qt::Checked weg lasse, dann werden überhaupt keine Checkboxen angezeigt!
könntest du mir weiter helfen ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Dein Model ist nur der Datenlieferant. Die View frägt die verschiedenen roles durch, und zeigt entsprechend an. Wenn bei einer role ein ungültiger QVariant zurück geliefert wird, wird eben nichts angezeigt. Ein return QVariant() IST ungültig!

Ein "checked()" hat im leeren Raum relativ wenig Sinn. Du willst ja in deinem Model etwas bestimmtes anzeigen - Daten im Allgemeinen. Zugrunde liegt meist irgend eine Struktur, die selber Daten und evtl. Infos hält (siehe QModelIndex::internalPointer()). Ein checked im Model sollte also einen tatsächlichen Zustand deiner Daten wieder spiegeln.

Ergo: Du musst dir den Zustand der CheckBox merken :P
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Eigentlich brauche ich erstmal nur Checkboxen im leeren Raum(Ersten drei Spalten) die sich aktivieren und deaktivieren lassen (Also keine Daten neben die Checkboxen)
Das dürfte wohl nicht zu schwierig sein, aber mit nur zwei Wochen Qt Erfahrung ist alles ein :?:
Wenn es möglich wäre, könntest du mir sagen wie ich mein Modell ergänzen soll.
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Beitrag von ScyllaIllciz »

Der Zustand von den Checkboxen sind dann Deine Daten!
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Meine Daten sind in die Spalten 4, 5 und 6.
In die ersten drei Spalten brauche ich nur checkboxen die der User aktivieren und deaktivieren kann.
Alles funktioniert prima bis auf diese checkboxen die sich nicht checken und unchecken lassen.
Je nachdem welchem zustand diese checkboxen aufweisen, wird der "Type" meiner Daten intern geändert, also an dem View brauche ich nichts außer checkbox Zustand zu ändern.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Egal was Du erzählst - ScyllaIllciz hat recht... wenn Du keine korrekten Daten zurücklieferst kann nichts korrektes angezeigt werden :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Beitrag von ScyllaIllciz »

Was verstehst Du darunter "alles funktioniert prima"? Für mich heisst das, dass Du die Daten aus anderen Spalten anzeigen/ändern kannst. Wo werden die Daten gespeichert? Mit sicherheit in irgendwelchen Variablen. In genau solchen Variablen muss der Zustand der Checkboxen gespeichert werden.

Beispiel:

Code: Alles auswählen

bool checkBox1=false
...
QVariant OutputsListModel::data ( const QModelIndex & index, int role) const 
{
    if ((role == Qt::DisplayRole) && (index.column()==4)){
        if(checkbox1)
            return Qt::Checked; 
        else
            Qt::Unchecked; 
    }
}
...
und in der setData Methode den Zustand der Checkbox in die Variable speichern.

Oder habe ich was falsch verstanden?
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Danke du hast mich genau verstanden, genau das wollte ich machen
Könntest du mir sagen wie ich der Zustand der checkboxen in die setData Methode speichern kann? Wird ich drei Variablen brauchen?(Eine für jede Spalte)

"Unter prima meinte ich dass meine Daten (Spalten 4,5 und 6) richtig angezeigt werden"
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

http://doc.trolltech.com/4.7/modelview. ... pplication sollte man einfach mal durcharbeiten anstatt sich die Arbeit von anderen erledigen zu lassen...
Wie Du Deine Daten intern verwaltest ist ist Dein Problem - das kommt darauf an was du damit anfangen willst, wo sie herkommen etc.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

ich danke euch zu sehr für eure Hilfe, und langsam fange ich jetzt zu verstehen.
jetzt habe ich eine neue Variable

Code: Alles auswählen

bool m_grid[Rows][3]
die den Zustand meine Checkboxen speichern soll (True für checked und false für unchecked).
Hier sind meine neue Data und setData Methoden

Code: Alles auswählen

QVariant myModel::data ( const QModelIndex & index, int role) const
{
    if((index.column() == 0 || index.column() == 1 || index.column() == 2)&& (role==Qt::CheckStateRole))
    {
        if (m_grid[index.row()][index.column()]) return Qt::Checked;
        else return Qt::Unchecked;
    }

    return QVariant();
}

bool myModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
    if (role == Qt::CheckStateRole)
    {
"Fehler"         m_grid[index.row()][index.column()]=m_grid[index.row()][index.column()].isChecked();
        return true;
    }
    return false;
}
wie erwartet zeigt der Compiler eine Fehler. :cry:
Was mache ich jetzt verkehrt ?
Zuletzt geändert von mugi am 10. Juli 2011 17:22, insgesamt 1-mal geändert.
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Beitrag von ScyllaIllciz »

bool hat auch keine Methode "isChecked" ;-)
Du wolltest bestimmt:

Code: Alles auswählen

m_grid[index.row()][index.column()]=value.toBool();
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Beitrag von mugi »

Daaaaaaaaaaaaaaanke ScyllaIllciz
endlich funktioniert es

nochmal danke an euch alle, ihr habt mich wirklich sehr geholfen
:D
Antworten