Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Blayder от Июль 18, 2009, 20:26



Название: заезжанная тема: цвета строк в QTableView
Отправлено: Blayder от Июль 18, 2009, 20:26
И в правду заезжанная тема, однако проблема на голом месте из-за нехватки знаний.

В течении усердных поисков по форуму выяснил все, что надо для закраски строки, однако чего я не понимаю:
если я делаю условие в делегате, допустим на проверку номера строки:
Код
C++ (Qt)
   if (index.row() == <номер строки>)
   {
painter->fillRect(rect, QColor(Qt::green));
   } else
   {
QItemDelegate::paint(painter, option, index);
   }
строка закрашивается как полагается, но мне не это надо...
У меня имеется такое условие, что:
 - если в колонке под номером 7 - пустое значение, то
 - надо закрасить всю строку в красный цвет,
 - если же в колонке 7 есть любое значение, но в колонке 8 пусто - в зеленый цвет,
 - иначе - оставляем как есть.
в коде получилось таким образом:
Код
C++ (Qt)
   if (index.column() == 7 && index.data( Qt::DisplayRole ).toString() == "")
   {
painter->fillRect(option.rect, QColor(Qt::red));
   } else
   if (index.column() == 8 && index.data( Qt::DisplayRole ).toString() == "")
   {
painter->fillRect(option.rect, QColor(Qt::green));
   } else
   {
QItemDelegate::paint(painter, option, index);
   }
В итоге закрашивается только сама ячейка, а не вся строка... предположение, что вся проблема в index.column() == , из-за которого меняется размер option.rect и я не могу понять, как же его именить до размеров всей строчки  :'(


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: Rcus от Июль 18, 2009, 20:36
Цитировать
QModelIndex QModelIndex::sibling ( int row, int column ) const

Returns the sibling at row and column or an invalid QModelIndex if there is no sibling at this position.
Use the Docs, Luke! ©


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: Blayder от Июль 18, 2009, 20:41
Благодарю тебя, о Великий джедай! :)
Прям в яблочко ткнули!!!
Еще раз, Благодарю Вас! :)

П.С. Эм... Нюанс - в закрашенных ячейка невидно текста, видать fillRect не совсем то, что надо...


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: Rcus от Июль 18, 2009, 20:54
Конечно :) если ваш код не менялся сильно, то получается либо fillRect, либо QItemDelegate::paint.
Способов лечения много, начиная от установки Qt::BackgroundRole в модели и заканчивая QStyleOptionViewItemV4::backgroundBrush.


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: Blayder от Июль 18, 2009, 21:10
Значит я до конца так и не вьехал:

Переопределение класса:
Код
C++ (Qt)
class MyDelegate : public QItemDelegate
{
private:
   void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
привязка оного к QTableView:
Код
C++ (Qt)
   MyDelegate *mDeleg = new MyDelegate;
   dbView->setItemDelegate(mDeleg);
ну и далее само его определение:
Код
C++ (Qt)
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   if (index.sibling(index.row(),7).data( Qt::DisplayRole ).toString() == "")
   {
   painter->fillRect(option.rect, QColor(Qt::red))
   } else
   if (index.sibling(index.row(),8).data( Qt::DisplayRole ).toString() == "")
   {
painter->fillRect(option.rect, QColor(Qt::green));
   } else
   {
QItemDelegate::paint(painter, option, index);
   }
}
 
Или надо было не paint переопределять, ато-то другое? Возможно BackgroudRole?


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: lit-uriy от Июль 18, 2009, 21:37
лучше с BackgroudRole, т.к. это фон. А когда paint, то это собственно рисование самого делегата в представлении.


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: Blayder от Июль 18, 2009, 23:00
Я наверно совсем тупой :(
Сижу чет и никак не могу найти никакого примера, как переопределить BackgroundRole
Натыкаюсь тока на примеры с переопределением того же paint или paintEvent...
вот как например тут обсуждалось: http://www.prog.org.ru/index.php?topic=4383.msg19971#msg19971
и ниже вообще привели вариант item->setData(Qt::BackgroundColor, Qt::red)
Я вообще уже ничего не понимаю :(
какого типа должен быть BackgroundRole, что возращать и как вообще устанавливать...
тут вот например http://www.prog.org.ru/topic_6144_0.html хоть и фон на кнопку, но выполняли через палету и так же на переопределение paint...



Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: lit-uriy от Июль 19, 2009, 00:00
>>начиная от установки Qt::BackgroundRole в модели


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: Blayder от Июль 19, 2009, 00:09
Как бы смешно небыло, но дебильный метод вышел о_О

Код
C++ (Qt)
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   if (index.sibling(index.row(),7).data( Qt::DisplayRole ).toString() == "")
   {
       painter->fillRect(option.rect, QColor(Qt::red));
   } else
   if (index.sibling(index.row(),8).data( Qt::DisplayRole ).toString() == "")
   {
       painter->fillRect(option.rect, QColor(Qt::green));    
   }
   QItemDelegate::paint(painter, option, index);
}
и работает... Просто после отрисовки закрашенной области, продолжаем дальше обычную процедуру отрисовки... хее


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: lit-uriy от Июль 19, 2009, 14:20
вообще правильнее такую работу делать в модели. Т.к. делегат представляет один элемент данных и похорошему он не должен лезть в чужую область.


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: Blayder от Июль 19, 2009, 23:36
Я пока начинающий и мало че еще понимаю, тчо вы имеете ввиду...
моя табличка использует QSqlQueryModel.
т.е. до setData можно добраться так:
dbView->model()->setData(..);
где dbView - QTableView;

Но не совсем понимаю что он именно делает  :-[
по F1 над setData получаем инфу в ассистенте: setData (http://doc.trolltech.com/4.5/qabstractitemmodel.html#setData)

Код:
bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )   [virtual]

Sets the role data for the item at index to value. Returns true if successful; otherwise returns false.
Как мне его применить?
под index наврено имеется ввиду нужная мне строка...
value... Что тут подразумевается? QBrush с нужным цветом?
а role? Qt::BackgroundRole???

В общем провел эксперимент:

Код
C++ (Qt)
model->setData(model->index(5,5),QColor(Qt::red),Qt::BackgroundRole);
dbView->setModel(model);
dbView->setSelectionBehavior(QAbstractItemView::SelectRows);
dbView->show();
результат никакой  ???
Знач я неверно понимаю...
и чет у меня странное ощущение, что я не ту модель дергаю  :-\

П.с. от блин...
Цитировать
The base class implementation returns false. This function and data() must be reimplemented for editable models. Note that the dataChanged() signal must be emitted explicitly when reimplementing this function.
эт чтоли значит, что надо переопределять QSqlQueryModel? или попробовать что-то другое?

П.С. Пошаманив над описанием тут (http://ru.opensuse.org/QT_%D0%B8_%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85#.D0.A0.D0.B0.D0.B1.D0.BE.D1.82.D0.B0_.D1.81_.D1.82.D0.B0.D0.B1.D0.BB.D0.B8.D1.86.D0.B0.D0.BC.D0.B8_.D0.B1.D0.B0.D0.B7_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85)
пришел к такому варианту, с переопределением QSqlQueryModel:
sql_test.h :
Код
C++ (Qt)
class mySqlQueryModel : public QSqlQueryModel
{
   Q_OBJECT
public:
   QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
};
sql_test.cpp:
Код
C++ (Qt)
QVariant mySqlQueryModel::data(const QModelIndex &index, int role) const
{
   QVariant value = QSqlQueryModel::data(index, role);
 
   if(role == Qt::BackgroundColorRole)
   {
if (index.sibling(index.row(),7).data( Qt::DisplayRole ).toString() == "" && index.sibling(index.row(),8).data( Qt::DisplayRole ).toString() == "")
{
   return qVariantFromValue(QColor(Qt::darkRed));
} else
if (index.sibling(index.row(),7).data( Qt::DisplayRole ).toString() != "" && index.sibling(index.row(),8).data( Qt::DisplayRole ).toString() == "")
{
   return qVariantFromValue(QColor(Qt::darkGreen));
} else
   return value;
   } else
   return value;
}

Так будет правильней?


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: lit-uriy от Июль 20, 2009, 01:57
>>моя табличка использует QSqlQueryModel.
>>эт чтоли значит, что надо переопределять QSqlQueryModel? или попробовать что-то другое?
Да, именно это имелось в виду сделать свою модель, или промежуточную модель (модель-посредник, proxymodel)


Название: Re: заезжанная тема: цвета строк в QTableView
Отправлено: lit-uriy от Июль 20, 2009, 01:59
>>Так будет правильней?
в код не вникал, но направление правильное