Qt делегаты и условное форматирование

317
15 марта 2017, 19:29

Нужно создать делегат для столбца в таблице, который меняет цвет фона в ячейке по цветовой шкале от самого большого значения (тёмно-зелёный) до самого маленького (тёмно-красный). В Excel'e это выглядит так:

Answer 1

Я бы сделал так:

class Model : public QAbstractItemModel{
    struct Item{
        int value;
        QColor color;
        Item(int value = 0,
             const QColor &color = QColor()):
            value(value),
            color(color),
        {}
    };
    struct ToPointer{
        Item* operator()(Item &item) const{
            return &item;
        }
    };
    struct LessValue{
        bool operator()(Item *first, Item *second) const{
            return first->value < second->value;
        }
    };
    QVector<Item> _items;
    void _updateColors(){  
        QVector<Item*> items(_items.size());
        std::transform(_items.begin(), _items.end(), items, ToPointer());
        std::sort(items.begin(), items.end(), LessValue());
        for(int i = 0; i < items.size(); ++i){
            items[i]->color = indexToColor(i);
        }
        QModelIndex topLeft = index(0, 0);
        QModelIndex bottomRight = index(items.size(), 0);
    }
public:
    QVariant data(const QModelIndex & index, int role) const{
        //...
        if(role == Qt::BackgroundRole){
            return QBrush(_items[index.row()].color);
        }
        //...
    }
};

Данные и цвета хранятся в вместе, каждый раз когда данные в модели меняются нужно вызывать _updateColors(), чтобы обновить цвета.

PS: Я не стал ломать голову над тем как реализовать метод indexToColor. Это тема для отдельного вопроса.

Answer 2

Так а сам вопрос-то в чём? Нужно создавать делегат - создавай. Если нужно поменять цвет фона в ячейке таблицы, то это делается примерно так:

QTableWidgetItem *item = new QTableWidgetItem();
...
item->setText(QString::number(...));
ui->tableWidget->setItem(r, c, item);
// цвет ячейки надо менять после того, как ячейку установили
ui->tableWidget->item(r, c)->setBackground(QColor(...));
...
READ ALSO
Численные методы (метод хорд)

Численные методы (метод хорд)

Было задание найти корни уравнения методом хордКод выглядит следующим образом:

280
Из struct в class и чтение с файла C++

Из struct в class и чтение с файла C++

Всем доброго времени суток, помогите пожалуйста разобратьсяБыла некая структура:

261
C++, Bluetoth Low Energy. Find device, How to connect [требует правки]

C++, Bluetoth Low Energy. Find device, How to connect [требует правки]

I have a problem, I work with Bluetooth Low EnergyI do not know how to organize a device search (Scan)

238
Задана квадратная матрица порядка N. Вычислить сумму положительных элементов, лежащих ниже побочной диагонали [требует правки]

Задана квадратная матрица порядка N. Вычислить сумму положительных элементов, лежащих ниже побочной диагонали [требует правки]

Предусмотреть два варианта ввода элементов массива: ввод с клавиатуры и ввод через генерацию случайных чиселРешение должно использовать...

266