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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: заезжанная тема: цвета строк в QTableView  (Прочитано 15832 раз)
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 и я не могу понять, как же его именить до размеров всей строчки  Плачущий
Записан
Rcus
Гость
« Ответ #1 : Июль 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! ©
Записан
Blayder
Гость
« Ответ #2 : Июль 18, 2009, 20:41 »

Благодарю тебя, о Великий джедай! Улыбающийся
Прям в яблочко ткнули!!!
Еще раз, Благодарю Вас! Улыбающийся

П.С. Эм... Нюанс - в закрашенных ячейка невидно текста, видать fillRect не совсем то, что надо...
« Последнее редактирование: Июль 18, 2009, 20:44 от Blayder » Записан
Rcus
Гость
« Ответ #3 : Июль 18, 2009, 20:54 »

Конечно Улыбающийся если ваш код не менялся сильно, то получается либо fillRect, либо QItemDelegate::paint.
Способов лечения много, начиная от установки Qt::BackgroundRole в модели и заканчивая QStyleOptionViewItemV4::backgroundBrush.
Записан
Blayder
Гость
« Ответ #4 : Июль 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?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июль 18, 2009, 21:37 »

лучше с BackgroudRole, т.к. это фон. А когда paint, то это собственно рисование самого делегата в представлении.
Записан

Юра.
Blayder
Гость
« Ответ #6 : Июль 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...

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июль 19, 2009, 00:00 »

>>начиная от установки Qt::BackgroundRole в модели
Записан

Юра.
Blayder
Гость
« Ответ #8 : Июль 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);
}
и работает... Просто после отрисовки закрашенной области, продолжаем дальше обычную процедуру отрисовки... хее
« Последнее редактирование: Июль 19, 2009, 00:15 от Blayder » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июль 19, 2009, 14:20 »

вообще правильнее такую работу делать в модели. Т.к. делегат представляет один элемент данных и похорошему он не должен лезть в чужую область.
Записан

Юра.
Blayder
Гость
« Ответ #10 : Июль 19, 2009, 23:36 »

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

Но не совсем понимаю что он именно делает  Обеспокоенный
по F1 над setData получаем инфу в ассистенте: 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? или попробовать что-то другое?

П.С. Пошаманив над описанием тут
пришел к такому варианту, с переопределением 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;
}

Так будет правильней?
« Последнее редактирование: Июль 20, 2009, 00:32 от Blayder » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Июль 20, 2009, 01:57 »

>>моя табличка использует QSqlQueryModel.
>>эт чтоли значит, что надо переопределять QSqlQueryModel? или попробовать что-то другое?
Да, именно это имелось в виду сделать свою модель, или промежуточную модель (модель-посредник, proxymodel)
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Июль 20, 2009, 01:59 »

>>Так будет правильней?
в код не вникал, но направление правильное
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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