У меня есть в Базе таблица 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();
}
}
Полностью самостоятельный пример цветной 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
уже существует и у текущего пользователя есть право на локальное подключение без пароля.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Имею структуру pair<int, pair<int, int>>, через typedef обозванную как guardИмею set<guard, comp>, с компаратором, который сравнивает только по second
стоит задача визуализировать граф как на изображении нижеЕсть код на с++, описывающий графы данного вида
Чем std::unique_lock отличается от std::lock_guard? В каких ситуациях лучше применять один класс, а в каких другой?