Как задать строке задний фон в QTableView, если данные цвета хранятся в БД?

205
24 июля 2018, 02:30

У меня есть в Базе таблица log:

В ней хранятся условные обозначения цветов в колонки color. Есть вторая таблица data которая связана с log по колонке id_log :

Как мне с помощью делегатов задать цвет заднего фона строк, относительно того к какому журналу относиться запись в data таблице?

Построение таблицы data в программе:

void MainWindow::TableLogBuilding() {
    Login connLog;
    connLog.connOpen();
    QSqlError dbError;
    QSqlQuery *queryLog = new QSqlQuery(connLog.mydb);
    QStandardItemModel *modelLog = new QStandardItemModel;
    QStandardItem *itemLog;
    int rowLog = 0;
    bool queryTableRes = queryLog->exec("SELECT * FROM public.data");
    if (queryTableRes) {
        //Заголовки столбцов
        QStringList horizontalHeader;
        horizontalHeader.append("Название файла");
        horizontalHeader.append("Кликабельные ссылки на файл");
        horizontalHeader.append("Широта");
        horizontalHeader.append("Долгота");
        horizontalHeader.append("Журнал");
        modelLog->setHorizontalHeaderLabels(horizontalHeader);
        while (queryLog->next()) {
            itemLog = new QStandardItem(queryLog->value(1).toString());
            modelLog->setItem(rowLog, 0, itemLog);
            itemLog = new QStandardItem(queryLog->value(2).toString());
            modelLog->setItem(rowLog, 1, itemLog);
            itemLog = new QStandardItem(queryLog->value(3).toString());
            modelLog->setItem(rowLog, 2, itemLog);
            itemLog = new QStandardItem(queryLog->value(4).toString());
            modelLog->setItem(rowLog, 3, itemLog);
            itemLog = new QStandardItem(queryLog->value(5).toString()); // id_log журнал к которому относиться запись
            modelLog->setItem(rowLog, 4, itemLog);
            rowLog++;
        }
    }else{
        dbError = connLog.mydb.lastError();
        QMessageBox::critical(this, "Ошибка", dbError.text(), QMessageBox::Close);
    }
    HrefDelegate *HrefD = new HrefDelegate(this);
    TableLog->setModel(modelLog);
    TableLog->setItemDelegateForColumn(1, HrefD);
    ColorDelegate *ColorD = new ColorDelegate(this);
    TableLog->setItemDelegate(ColorD);
    connLog.connClose();
}

colordelegate.h :

#ifndef COLORDELEGATE_H
#define COLORDELEGATE_H
#include <QStyledItemDelegate>
#include <QObject>
class ColorDelegate: public QStyledItemDelegate {
    Q_OBJECT
public:
    ColorDelegate(QObject *parent);
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
};
#endif // COLORDELEGATE_H

colordelegate.cpp

#include "colordelegate.h"
#include <QColor>
ColorDelegate::ColorDelegate(QObject *parent)
    : QStyledItemDelegate(parent) {
}
void ColorDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
}
void ColorDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
        const int rows = index.model()->rowCount();
        for(int i = 0; i < rows; ++i)
        {
            QModelIndex idx = model->index(i, 4);
            model->data(idx,Qt::DisplayRole).toString();
        }
}
Answer 1

Полностью самостоятельный пример цветной proxy-модели и её применения одним файлом:

#include <stdlib.h>
#include <assert.h>
#include <QtCore/QDebug>
#include <QtGui/QApplication>
#include <QtGui/QTableView>
#include <QtGui/QIdentityProxyModel>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlRecord>
#include <QtSql/QSqlRelationalDelegate>
#include <QtSql/QSqlRelationalTableModel>
class ColorizeProxyModel: public QIdentityProxyModel {
    Q_OBJECT
public:
    explicit ColorizeProxyModel (QObject *parent = 0)
        : QIdentityProxyModel (parent), m_colorColumn (0) {}
    virtual ~ColorizeProxyModel () {}
    void setColorColum (int col) { m_colorColumn = col; }
    int colorColumn () { return m_colorColumn; }
    virtual QVariant data (const QModelIndex &id, int role = Qt::DisplayRole) const {
      if (role == Qt::BackgroundRole) {
        QModelIndex sourceIndex = mapToSource (id);
        QModelIndex colorStrIndex = sourceIndex.sibling (sourceIndex.row (), m_colorColumn);
        QString colorName = colorStrIndex.model ()->data (colorStrIndex).toString ();
        return QBrush (QColor (colorName));
      } else {
        return QIdentityProxyModel::data(id, role);
      }
    }
private:
    int m_colorColumn;
};
void queryOrDie (QString qStr, QSqlDatabase db) {
    QSqlQuery q = db.exec (qStr);
    if (q.lastError ().isValid ()) {
        qDebug () << "Query failed: " << qStr;
        qDebug () << "With error:   " << q.lastError ();
        abort();
    }
}
int main(int argc, char *argv[]) {
    QApplication a (argc, argv);
    QSqlDatabase db = QSqlDatabase::addDatabase ("QMYSQL");
    db.setDatabaseName ("test");
    bool ok = db.open ();
    assert (ok); assert (db.isOpen());
    queryOrDie ("DROP TABLE IF EXISTS data", db);
    queryOrDie ("DROP TABLE IF EXISTS color", db);
    queryOrDie ("CREATE TABLE color ("
                "  id INT PRIMARY KEY,"
                "  name VARCHAR(64)"
                ")", db);
    queryOrDie ("CREATE TABLE data ("
                 "  id INT PRIMARY KEY AUTO_INCREMENT,"
                 "  data VARCHAR(64),"
                 "  color_id INT,"
                 "  FOREIGN KEY (color_id) REFERENCES color(id)"
                 ")", db);
    queryOrDie ("INSERT INTO color (id, name) VALUES"
                "  (0, 'cyan'), (1, 'coral'), (2, '#f12443')", db);
    queryOrDie ("INSERT INTO data (data, color_id) VALUES"
                "  ('hello world', 0), ('goodbye world', 1), ('some mash', 2)", db);
    QSqlRelationalTableModel model (0, db);
    model.setTable ("data");
    int colorCol = model.record ().indexOf ("color_id");
    model.setHeaderData (model.record ().indexOf ("id"),   Qt::Horizontal, QObject::tr ("Number"));
    model.setHeaderData (model.record ().indexOf ("data"), Qt::Horizontal, QObject::tr ("Data"));
    model.setRelation (colorCol, QSqlRelation ("color", "id", "name"));
    model.setHeaderData (colorCol, Qt::Horizontal, QObject::tr ("Color"));
    model.setEditStrategy (QSqlTableModel::OnRowChange);
    model.select ();
    ColorizeProxyModel colorModel;
    colorModel.setSourceModel (&model);
    colorModel.setColorColum (colorCol);
    QTableView *tbl = new QTableView ();
    tbl->setModel (&colorModel);
    tbl->setWindowTitle (QObject::tr ("A colorful table"));
    tbl->hideColumn (colorCol);
    tbl->show ();
    model.select ();
    return a.exec ();
}
#include "main.moc"

Пример подразумевает, что база test уже существует и у текущего пользователя есть право на локальное подключение без пароля.

READ ALSO
Закладываю в set 7 гарантированно различных элементов, а получаю только 6

Закладываю в set 7 гарантированно различных элементов, а получаю только 6

Имею структуру pair<int, pair<int, int>>, через typedef обозванную как guardИмею set<guard, comp>, с компаратором, который сравнивает только по second

199
Не запускается программа

Не запускается программа

Пытаюсь нарисовать треугольник, но что то идет не так

248
Библиотека для визуализации графа на с++

Библиотека для визуализации графа на с++

стоит задача визуализировать граф как на изображении нижеЕсть код на с++, описывающий графы данного вида

179
Чем std::unique_lock отличается от std::lock_guard?

Чем std::unique_lock отличается от std::lock_guard?

Чем std::unique_lock отличается от std::lock_guard? В каких ситуациях лучше применять один класс, а в каких другой?

159