Возможно ли реализовать такое на QTreeView и QStandardItemModel?

Сделал поделку на QTreeView и QStandardItemModel:

ff783edb0f1045a184e7b7278328a702.jpg

Если коротко показывается корреляция между странами по какому-то параметру (допустим, величина торговых отношений). Чем больше этот параметр, тем ярче цвет в ячейке. При выборе ячейки соответствующие страны выделяются. Все вроде хорошо, но не могу сделать оставшиеся "мелочи":

1) Цветные ячейки сделать все одного размера.
Пытался сделать в методе data вот это, не помогло:
if (role == Qt::SizeHintRole)
{
      if (isColorCell())
         return QSize(50, 50);
}

2) Ячейки с текстом сделать растягивающимися по величине текста, не изменяя размера соответствующих цветных ячеек (если это возможно).

3) Изменить цвет при выделении (сейчас стандартный виндовый). Обрабатываю событие клика мыши по цветной ячейке и выделяю все цветные, лежащие с ней на одной строке и столбце. Цвет выделения закрывает внутренний цвет ячейки. Хотелось бы сменить цвет выделения на менее яркий и сделать его почти прозрачным.

Пытался сделать так в конструкторе вьюшки, но цвет выделения не изменился:
QPalette p = palette();
    p.setColor(QPalette::Highlight, QColor("#FFFFCC"));
    p.setColor(QPalette::HighlightedText, Qt::black);
    setPalette(p);


К слову выделяю ячейки так:
selectionModel()->select(index, QItemSelectionModel::ClearAndSelect |
                                    QItemSelectionModel::Rows |
                                    QItemSelectionModel::Columns);

4) Сделать белую рамку в пару пикселей между цветными ячейками, чтобы цвета не сливались.

Буду благодарен подсказанькам.
  • Вопрос задан
  • 4184 просмотра
Пригласить эксперта
Ответы на вопрос 2
@DancingOnWater
1) Размер задается в хедере (если ничего не путаю) А так можно посмотреть по срабатыванию event-ов кто чем рулит

2) Никак, это вам уже надо вьювер менять

3)Изменить соответсвующий обработчик событий
Ответ написан
Комментировать
@xseven
Можно сделать почти все из желаемого

Нужно унаследоваться от QStyledItemDelegate

1. Размер ячейки (максимально желаемый) выдается от делегата с помозью метода sizeHint
При работе с ним есть какие-то тонкости, но если добавить метасвойства к данным то можно менять размеры (но в разумных пределах)
2. Выделение нужно смотреть в методе делегата paint
Например я сделал так
void myClass::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
...
//[In case of selection override colour to selection color except mean row]
    if(QStyle::State_Selected & option.state)
    {
        QColor selectedColor = QApplication::palette().color(QPalette::Highlight);
        cellBrush = QBrush(selectedColor);
    }

    //[Fill background]
    painter->fillRect(itemRect, cellBrush);
}


Ну и т.д

Желательно прочесть:
qt-project.org/doc/qt-4.8/model-view-programming.html
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы