crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> CheckBox в QTableView
Viper360
  опции профиля:
сообщение 26.1.2010, 14:48
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 17.1.2010
Пользователь №: 1379

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток! Подскажите, как побороть проблему с чекбоксами : унаследовал модель от QSqlQueryModel чтобы поля БД типа boolean отображались как Qt::CheckStateRole :

bool ischeck (QVariant data) {
    if (data.isValid())
        return (data.type()==QVariant::Bool) ? true : false;
    else return false;
}

vtabmodel::vtabmodel (QObject *parent)
        : QSqlQueryModel(parent)
{
}

Qt::ItemFlags vtabmodel::flags (const QModelIndex &index) const {
    Qt::ItemFlags flags=QSqlQueryModel::flags(index);
    if (ischeck(QSqlQueryModel::data(index)))
        flags=Qt::ItemIsUserCheckable;
    else
        flags|=Qt::ItemIsEditable;
    return flags;
}

QVariant vtabmodel::headerData (int section,Qt::Orientation orientation,int role) const {
    if (section<0||role!=Qt::DisplayRole)
        return QVariant();
    if (orientation==Qt::Vertical)
        return this->index(section,0).data(); // 0 - number of column
    return QSqlQueryModel::headerData(section,orientation,role); // horizontal header
}

QVariant vtabmodel::data(const QModelIndex &index,int role) const {
    QVariant value=QSqlQueryModel::data(index,role);
    QVariant data=QSqlQueryModel::data(index);
    if (ischeck(data))
        value.clear();
    if (role==Qt::CheckStateRole&&ischeck(data)) {
        return (data.toBool()) ? Qt::Checked : Qt::Unchecked;
    } else
        return value;
}


Но далее столкнулся с тем, что чекбокс выравнивается по левому краю ячейки и текст TRUE/FALSE (естественно) не пропадает. Пошел таким путем :

    if (ischeck(data))
        value.clear();


чтобы убрать текст, а для выравнивания создал делегат :

AlignItemDelegate::AlignItemDelegate (QObject *parent)
        : QItemDelegate(parent)
{
}

void AlignItemDelegate::drawCheck (QPainter *painter,const QStyleOptionViewItem &option,const QRect &,Qt::CheckState state) const {
    const int textMargin=QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin)+1;
    QRect checkRect = QStyle::alignedRect(option.direction, Qt::AlignCenter,
                                          check(option,option.rect,Qt::Checked).size(),
                                          QRect(option.rect.x()+textMargin,option.rect.y(),
                                                option.rect.width()-(textMargin*2),option.rect.height()));
    QItemDelegate::drawCheck(painter,option,checkRect,state);
}


После чего вставил его в необходимые колонки с помощью setItemDelegateForColumn. Но самая большая беда осталась с выделением строк. Если выделять ячейку с чекбоксом, то выделение его закрывает (перекрывает), т.е. видно его только в том кусочке ячейки, в котором он было до установки делегата. И еще при установке делегата меняется стиль самого выделения, вместо красивой закругленной рамки появляется грубая заливка по контуру. Помогите пожалуйста, может кто решал схожие проблемы. Изначально решил свою проблему просто перекрыв QSqlQueryModel::flags и для полей с чекбоксами грубо установил flags=Qt::ItemIsUserCheckable; без возможности выделения, но сейчас появилась большая необходимость вспомнить о проблеме и решить ее. Очень надеюсь на помощь, либо подсказку. Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 10:23