Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: aasavelev от Февраль 07, 2015, 17:15



Название: QtableView разноцветные строки и Checkbox в одной из колонок
Отправлено: aasavelev от Февраль 07, 2015, 17:15
Здравствуйте. подскажите как можно реализовать чтоб необходимые мне строки были закрашены каким-нибудь цветом. А также  в одyой из колонок был CheckBox, при установки значения в истину строка должна оставить белой если ложь, то строка должна быть например серой? CheckBox Установить в колонку знаю как, но не знаю как связать изменение состояния CheckBox с раскраской строки и изменение значения в таблице(к  которой привязан QtableView).

Код:
#include "checkboxdelegate.h"

CheckBoxDelegate::CheckBoxDelegate(QObject *parent, int checkColumnIx) :
    QItemDelegate(parent)
{
    checkBoxColumnIx = checkColumnIx;
}

CheckBoxDelegate::~CheckBoxDelegate(){

}

QWidget *CheckBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem &option,
                      const QModelIndex &index) const
{
    if (index.column() == checkBoxColumnIx)
    {
        QCheckBox* chb = new QCheckBox(parent);
        return chb;
    } else {
        return QItemDelegate::createEditor(parent, option, index);
    }
}

void CheckBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    if (index.column() == checkBoxColumnIx)
    {
        int checked = index.model()->data(index, Qt::DisplayRole).toInt();
        QCheckBox* chb = qobject_cast<QCheckBox*>(editor);
        chb->setChecked(checked == 1);
    } else {
        QItemDelegate::setEditorData(editor, index);
    }
}

void CheckBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    if (index.column() == checkBoxColumnIx)
    {

    } else {
        QItemDelegate::setModelData(editor, model, index);
    }
}


void CheckBoxDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex & index ) const
{
    editor->setGeometry(option.rect);
}

void CheckBoxDelegate::paint(QPainter * painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
{
    if (index.column() == checkBoxColumnIx)
    {
        QWidget *w = dynamic_cast<QWidget *>(painter->device());
        if (w)
        {
            QItemDelegate::drawBackground( painter, option, index );
            QItemDelegate::drawCheck( painter, option, option.rect, index.data(Qt::EditRole).toBool() ? Qt::Checked : Qt::Unchecked );
            drawFocus(painter, option, option.rect);
        }
    } else {
        QItemDelegate::paint(painter, option, index);
    }
}


Название: Re: QtableView разноцветные строки и Checkbox в одной из колонок
Отправлено: kambala от Февраль 07, 2015, 23:32
чекбокс может и дефолтный делегат отрисовать, просто возвращай в модели флаги, включающие Qt::ItemIsUserCheckable, для нужных индексов.

ну а цвет в виде QBrush просто из data() модели возвращай для роли Qt::BackgroundRole