Russian Qt Forum
Ноябрь 27, 2024, 22:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTableView, QSqlQueryModel раскрашиваем...  (Прочитано 15163 раз)
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« : Январь 24, 2007, 01:59 »

Никто не сталкивался  с такой задачей?
Есть QTableView, отображающий QSqlQueryModel, и в зависимости от данных в каждой строке определённой колонки, нужно раскрасить строку QTableView в определённый цвет...
Вроде задача нужная, так как визуальности придаёт на 5+.
Записан
Alexei
Гость
« Ответ #1 : Январь 24, 2007, 08:03 »

Нужно использовать делегаты
Записан
nova
Гость
« Ответ #2 : Январь 24, 2007, 20:44 »

А есть пример с хорошо переопределенным методом paint()?
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #3 : Январь 29, 2007, 06:38 »

Цитата: "Alexei"
Нужно использовать делегаты

А делегат позволит проанализировать несколько ячеек и в зависимости от разницы между ними закрасиь строку в нужный цвет?
Записан
burunduk
Гость
« Ответ #4 : Январь 29, 2007, 15:36 »

а без делегатов с помощью ролей никак нельзя ?
Записан
crocus
Гость
« Ответ #5 : Январь 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.
Записан
burunduk
Гость
« Ответ #6 : Январь 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);
}
Записан
crocus
Гость
« Ответ #7 : Январь 31, 2007, 03:20 »

А как и где вызываешь функцию?
Записан
burunduk
Гость
« Ответ #8 : Январь 31, 2007, 10:18 »

Эта ф-ция замещается в переопределённом классе модели

Код:

class MSqlQueryModel : public QSqlDataModel {
  QVariant data(const QModelIndex &index, int role) const;
};
Записан
crocus
Гость
« Ответ #9 : Январь 31, 2007, 12:35 »

Благодарю!
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #10 : Февраль 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);
}


А нет примера, чтоб при выделении строки, она зелёным покрывалась? Улыбающийся
Какие-то флаги проверить?
А то что то туплю уже... найти не могу...
Записан
crocus
Гость
« Ответ #11 : Февраль 03, 2007, 04:18 »

Посмотри внимательнее - в варианте burundukа идет переопределение модели
QSqlQueryModel, т.е. раскраска происходит при инициализации (получении данных)-я так понимаю это конечно:
Код:

model = new MSqlQueryModel(this);

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



Но зеленые почему-то при клике не меняют цвет??
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #12 : Февраль 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));
Записан
BELNETMON
Гость
« Ответ #13 : Апрель 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();
     //вот в этом моменте мы получаем значения явно не от этой записи
     //если выводить в лог от всех вызовов, то выясняется, что еще и везде одинаковые
....

Может кто сталкивался?
« Последнее редактирование: Апрель 25, 2009, 16:24 от BELNETMON » Записан
Rigat
Гость
« Ответ #14 : Июнь 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'
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 22.