Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Sergey B. от Январь 24, 2007, 01:59



Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: Sergey B. от Январь 24, 2007, 01:59
Никто не сталкивался  с такой задачей?
Есть QTableView, отображающий QSqlQueryModel, и в зависимости от данных в каждой строке определённой колонки, нужно раскрасить строку QTableView в определённый цвет...
Вроде задача нужная, так как визуальности придаёт на 5+.


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: Alexei от Январь 24, 2007, 08:03
Нужно использовать делегаты


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: nova от Январь 24, 2007, 20:44
А есть пример с хорошо переопределенным методом paint()?


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: Sergey B. от Январь 29, 2007, 06:38
Цитата: "Alexei"
Нужно использовать делегаты

А делегат позволит проанализировать несколько ячеек и в зависимости от разницы между ними закрасиь строку в нужный цвет?


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: burunduk от Январь 29, 2007, 15:36
а без делегатов с помощью ролей никак нельзя ?


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: crocus от Январь 30, 2007, 13:51
Короче запарился в одного тупить 6 часов к ряду:
Код:

...........................
connect( tableView->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ),
this, SLOT( colorRows( QItemSelection, QItemSelection )));
...........................

class RealCurItemDelegate : public QItemDelegate
{
public:
RealCurItemDelegate::RealCurItemDelegate(QObject * parent = 0)
: QItemDelegate (parent) { }
void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
QStyleOptionViewItem opt = option;
QBrush fill = opt.palette.brush(QPalette::Background);
if (index.isValid() && index.column() == 6) {
fill.setColor(Qt::red);
} else if(index.isValid() && index.column() == 10){
fill.setColor(Qt::blue);
}else {
fill.setColor(Qt::yellow);
}

painter->fillRect(opt.rect, fill);
QItemDelegate::paint(painter, opt, index);

}
};

void MainWindow::colorRows( const QItemSelection &selected,
  const QItemSelection &deselected )
{
QModelIndex index;
QModelIndexList items = deselected.indexes();

int dataFields;
foreach ( index, items )
{
dataFields = model->data( index, Qt::DisplayRole ).toInt();
if (dataFields >= 35) {
RealCurItemDelegate *delegat = new RealCurItemDelegate();
tableView->setItemDelegateForRow(index.row(), delegat);
}
}
}


В общем раскрашивает при выделении, за код не пинайте, доработайте кто-нибудь, чтоб ракрашивало при инициализации модели. Полагаю как-то надо проиндексировать все строки, скажем в заданном столбце, но как? уже совсем не понимаю.

P.S: model - QSqlTableModel.


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: burunduk от Январь 30, 2007, 14:01
я вот так у себя раскрашиваю:

Код:

QVariant MSqlQueryModel::data(const QModelIndex &index, int role) const {
  if(role == Qt::TextColorRole) {
    double area = record(index.row()).value(3).toDouble();
    if(area > 0.001) return QVariant(QColor(Qt::blue));
  }
  return QSqlQueryModel::data(index, role);
}


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: crocus от Январь 31, 2007, 03:20
А как и где вызываешь функцию?


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: burunduk от Январь 31, 2007, 10:18
Эта ф-ция замещается в переопределённом классе модели

Код:

class MSqlQueryModel : public QSqlDataModel {
  QVariant data(const QModelIndex &index, int role) const;
};


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: crocus от Январь 31, 2007, 12:35
Благодарю!


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: Sergey B. от Февраль 02, 2007, 18:28
Цитата: "burunduk"
я вот так у себя раскрашиваю:

Код:

QVariant MSqlQueryModel::data(const QModelIndex &index, int role) const {
  if(role == Qt::TextColorRole) {
    double area = record(index.row()).value(3).toDouble();
    if(area > 0.001) return QVariant(QColor(Qt::blue));
  }
  return QSqlQueryModel::data(index, role);
}


А нет примера, чтоб при выделении строки, она зелёным покрывалась? :)
Какие-то флаги проверить?
А то что то туплю уже... найти не могу...


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: crocus от Февраль 03, 2007, 04:18
Посмотри внимательнее - в варианте burundukа идет переопределение модели
QSqlQueryModel, т.е. раскраска происходит при инициализации (получении данных)-я так понимаю это конечно:
Код:

model = new MSqlQueryModel(this);

т.к. модель создана.
А  в моем варианте работает через QItemDelegate и и при сигналах модели или tableView->selectionModel() можешь подключить любой слот и colorRows в том числе, а можно даже комбинировать.
В приведенном коде при выделении строки ячейка 6 -закрашивается красным , 10 -синим, а остальные желтым, зеленая на базе MSqlQueryModel и не забудь про enum QAbstractItemView::SelectionBehavior

(http://source.foliant.net.ru/screen.png)

Но зеленые почему-то при клике не меняют цвет??


Название: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: Sergey B. от Февраль 04, 2007, 09:12
Цитата: "crocus"
Посмотри внимательнее - в варианте burundukа идет переопределение модели
QSqlQueryModel, т.е. раскраска происходит при инициализации (получении данных)-я так понимаю это конечно:
Код:

model = new MSqlQueryModel(this);

т.к. модель создана.
А  в моем варианте работает через QItemDelegate и и при сигналах модели или tableView->selectionModel() можешь подключить любой слот и colorRows в том числе, а можно даже комбинировать.
В приведенном коде при выделении строки ячейка 6 -закрашивается красным , 10 -синим, а остальные желтым, зеленая на базе MSqlQueryModel и не забудь про enum QAbstractItemView::SelectionBehavior



Но зеленые почему-то при клике не меняют цвет??



У меня есть модель (QSqlQueryModel), так вот, сделав по примеру burundukа, всё работает.
Смысл таков что если дата текущяя, больше содержащейся в ячейке
Код:
QDate tempdate = record(index.row()).value(3).toDate();

то  даём
Код:
return QVariant(QColor(Qt::red)); 

Но самое интересное, если запустить прогу, открыть окно (модальное) и менять дату в винде, при переходе к программе строка закрашивается...
Может есть  роль какая-то...
Что типа, как пример:
Код:
 if(record.selected() ) return QVariant(QColor(Qt::gree));


Название: Re: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: BELNETMON от Апрель 23, 2009, 16:09
Что-то вариант с перекрытием модели не очень корректно срабатывает на доступе к данным.
Задача: хочется получить значение поля из роли, допустим "цвет фона". Проанализировать, и выбрать цвет
В таком случае, как указывается выше, мы обращаемся к рекорду "...record(index.row()).value(3).toDouble();.."
У меня в таком случае возвращается значение явно не связанное с текущей ячейков. То есть поле по индексу или имени определяется правильно, а вот значение - нет.
То же самое можно проверить, допустим, реализуя роль Qt::DisplayRole, пытаясь проанализировать какое-либо другое поле. То же самое, возвращает не то что надо. QT 4.5+QTCreator1.1rc1+SQLite

Код:
QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
  switch (role)
  {
   case Qt::BackgroundColorRole:
      int i = record(index.row()).value(1).toInt();
     //вот в этом моменте мы получаем значения явно не от этой записи
     //если выводить в лог от всех вызовов, то выясняется, что еще и везде одинаковые
....

Может кто сталкивался?


Название: Re: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: Rigat от Июнь 01, 2012, 00:35
я вот так у себя раскрашиваю:

Код:
QVariant MSqlQueryModel::data(const QModelIndex &index, int role) const {
  if(role == Qt::TextColorRole) {
    double area = record(index.row()).value(3).toDouble();
    if(area > 0.001) return QVariant(QColor(Qt::blue));
  }
  return QSqlQueryModel::data(index, role);
}
У меня этот вариант выдает ошибки:
error: invalid use of incomplete type 'struct QSqlRecord'
error: forward declaration of 'struct QSqlRecord'


Название: Re: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: Serr500 от Июнь 01, 2012, 08:17
Код:
#include <QSqlRecord>

P.S. Кода же вы все начнёте думать?  >:(


Название: Re: QTableView, QSqlQueryModel раскрашиваем...
Отправлено: sergun1604 от Июль 05, 2012, 15:20
Цитировать
Эта ф-ция замещается в переопределённом классе модели

Код:


class MSqlQueryModel : public QSqlDataModel {
  QVariant data(const QModelIndex &index, int role) const;
};

Подскажите пожалуйста а где это написать и как переопределить класс? не пойму...