Seite 1 von 2

ItemDelegate der nicht nur auf Edit Role angezeigt wird?

Verfasst: 5. September 2010 12:33
von gast23
Hi,

ich habe einen kleinen Checkbox Delegate implementiert.

Code: Alles auswählen

#include "checkboxdelegate.h"

#include <QDebug>

CheckboxDelegate::CheckboxDelegate(QObject *parent) :
    QStyledItemDelegate(parent)
{
}

QWidget* CheckboxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                                        const QModelIndex &index) const {

    QCheckBox *editor = new QCheckBox(parent);
    return editor;

}

void CheckboxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {

    bool value = index.model()->data(index, Qt::EditRole).toBool();

    qDebug() << value;

    QCheckBox *check = static_cast<QCheckBox*>(editor);
    check->setChecked(value);

}

void CheckboxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                    const QModelIndex &index) const {

    QCheckBox *check = static_cast<QCheckBox*>(editor);
    model->setData(index, check->isChecked(), Qt::EditRole);

    qDebug() << "setModelData" << check->isChecked();

}

void CheckboxDelegate::updateEditorGeometry(QWidget *editor,
                                            const QStyleOptionViewItem &option, const QModelIndex &index) const {

    editor->setGeometry(option.rect);

}
Dieser Delegate wird nur angezeigt wenn man per doppel click in die Celle klickt. Ich möchte jedoch das die Checkbox immer angezeigt wird und man einfach die Checkbox anklicken kann.

Viele Grüße

Verfasst: 5. September 2010 13:36
von upsala
Für eine CheckBox braucht man doch kein eigenes Delegate.

Schau dir mal Qt::CheckStateRole und Qt::CheckState an.

Verfasst: 5. September 2010 13:38
von gast23
Das beantwortet nicht meine Frage...

Verfasst: 5. September 2010 13:39
von gast23
Der Delegate ist nur ein Test... ich werd eine eigene Checkbox später implementieren...

Verfasst: 5. September 2010 19:25
von gast23
Kann mir niemand helfen? :(

Verfasst: 5. September 2010 21:22
von ScyllaIllciz
Schau mal hier, vielleicht hilft Dir das weiter.

Verfasst: 5. September 2010 22:58
von gast23
Oh das hört sich nach Arbeit an. Vielen Dank.

@upsala hast du ein Beispiel mit Checkstate?

Ich bekomme es zwar hin jedoch erscheint trotzdem noch der default Editor (Eine Combobox)

Verfasst: 6. September 2010 06:53
von upsala
Normalerweise reicht es aus hier

Code: Alles auswählen

Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const 
zusätzlich Qt::ItemIsUserCheckable zurückzugeben.

und bei

Code: Alles auswählen

QVariant QAbstractItemModel::data(const QModelIndex &index, int role=Qt::DisplayRole) const
wenn die Role Qt::CheckStateRole abgefragt wird einen davon: Qt::Unchecked, Qt::PartiallyChecked, Qt::Checked

Verfasst: 6. September 2010 18:11
von gast23
Ah ok!

Läßt sich diese 'Checkbox auch stylen?

Viele Grüße

Verfasst: 6. September 2010 18:56
von upsala
Aus den Sourcen von Qt:

Code: Alles auswählen

style->drawPrimitive(QStyle::PE_IndicatorViewItemCheck, &opt, painter, widget);
Somit wird des mit dem 'normalen' Widget-Style gezeichnet.

Verfasst: 6. September 2010 19:36
von gast23
Ich habe in meinem Stylesheet eine QCheckbox default mäßig gestylt jedoch übernimmt er es nicht... :(

Desweiteren kann ich meine Checkboxen die über QCheckState erzeugt werden nicht ändern :(

column 4 als Beispiel:

Code: Alles auswählen

Qt::ItemFlags MyModel::flags(const QModelIndex &index) const {

    if (!index.isValid())
        return Qt::ItemIsEnabled;

    if (index.column() == 4)
        return QAbstractItemModel::flags(index) | Qt::ItemIsUserCheckable;

    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;

}

Code: Alles auswählen

QVariant MyModel::data(const QModelIndex &index, int role) const {

    if (!index.isValid())
        return QVariant();

    if (index.row() >= liste->size() || index.row() < 0)
        return QVariant();

    EinObjekt* b = liste->at(index.row());

    if (role == Qt::DisplayRole || role == Qt::EditRole) {

        if (index.column() == 0)
            return b->...
        if (index.column() == 1)
            return b->..
        if (index.column() == 2)
            return b->sparte;
        if (index.column() == 3)
            return b->..

    } else if(role == Qt::CheckStateRole) {

//bool
        if (index.column() == 4)
            return b->...;

    }

    return QVariant();

}

Code: Alles auswählen

bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role) {

    if (index.isValid() && role == Qt::CheckStateRole) {

        if(index.column() == 4) {

            liste->at(index.row())->ist = value.toBool();
            emit dataChanged(index, index);
            return true;

        } 

    }

    return false;

}
Wäre um Hilfe dankbar!

Verfasst: 16. September 2010 18:45
von gast23
Hallo?

Verfasst: 16. September 2010 19:21
von solarix

Code: Alles auswählen

QVariant MyModel::data(const QModelIndex &index, int role) const {
     ...
        if (index.column() == 4)
            return b->ist ? Qt::Checked : Qt::Unchecked;

     ...
    }

Verfasst: 20. September 2010 14:03
von gast23
Danke!! Es hat endlich funktioniert :)

Nun ist die Frage wie ich diese Checkboxen stylen kann.

In meinem globalen Sheet ist eine Definition jedoch nutzt er die nicht :(

Hat jemand eine Idee?

Verfasst: 21. September 2010 20:54
von gast23
Niemand?