Russian Qt Forum
Ноябрь 23, 2024, 14:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtableView разноцветные строки и Checkbox в одной из колонок  (Прочитано 2519 раз)
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);
    }
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Февраль 07, 2015, 23:32 »

чекбокс может и дефолтный делегат отрисовать, просто возвращай в модели флаги, включающие Qt::ItemIsUserCheckable, для нужных индексов.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 22.