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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QStyledItemDelegate, QTableView и выделенная ячейка  (Прочитано 3442 раз)
interv
Гость
« : Апрель 05, 2012, 08:55 »

Создаю делегат class DateCellDelegate : public QStyledItemDelegate
вешаю его на QTableView setItemDelegate(new DateCellDelegate(this));
однако, при выделеной ячейке он рисует квадрат со смещением вверх и на лево на 1 пиксель, в последствии остаются линии от неверной зарисовки.
Что не так?
Далее код делегата
Код
C++ (Qt)
class DateCellDelegate : public QStyledItemDelegate
{
 Q_OBJECT
public:
 DateCellDelegate(QObject *parent = 0);
 void paint(QPainter *painter, const QStyleOptionViewItem &option,
              const QModelIndex &index) const;
protected:
 static QMap<QDate, bool> m_dates;
};
 
Код
C++ (Qt)
 
QMap<QDate, bool> DateCellDelegate::m_dates;
 
DateCellDelegate::DateCellDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
 if (m_dates.size()<=0)
 {
   //Etot blok mogno propustit', na primer ne vliyayet
   QSqlQuery reader =
     SQLConnect::conn()->Execute("SELECT date, isblue FROM daywork");
   while (reader.next())
     m_dates.insert(reader.value(0).toDate(), reader.value(1).toBool());
 }
}
 
void DateCellDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
{
 QColor start = QColor::fromRgba(qRgba(255, 117, 0, 255));
 QColor end = QColor::fromRgba(qRgba(255, 159, 77, 255));
 if (option.state & QStyle::State_Selected)
 {
   start = QColor::fromRgba(qRgba(0, 255, 117, 255));
   end = QColor::fromRgba(qRgba(77, 255, 159, 255));
 }
 else
 {
   if (index.data(Qt::UserRole+1).type() == QVariant::Date)
   {
     if (m_dates.contains(index.data(Qt::UserRole+1).toDate()))
     {
       bool isBlue = m_dates.value(index.data(Qt::UserRole+1).toDate(), false);
       if (isBlue)
       {
         start = QColor::fromRgba(qRgba(0, 117, 255, 255));
         end = QColor::fromRgba(qRgba(77, 159, 255, 255));
       }
       else
       {
         start = QColor::fromRgba(qRgba(218, 218, 218, 255));
         end = QColor::fromRgba(qRgba(245, 245, 245, 255));
       }
     }
   }
   else
   {
     start = QColor::fromRgba(qRgba(218, 218, 218, 255));
     end = QColor::fromRgba(qRgba(218, 218, 218, 255));
   }
 }
 QLinearGradient gradient;
 gradient.setStart(option.rect.topLeft());
 gradient.setFinalStop(option.rect.bottomLeft());
 gradient.setColorAt(1, start);
 gradient.setColorAt(0, end);
 painter->setPen(start);
 painter->setBrush(gradient);
 //esli eto uslovie ubrat', to budet tol'ko huge
 if (option.state & QStyle::State_Selected)
   painter->setPen(Qt::NoPen);
 painter->drawRect(option.rect);
 painter->setPen(QPen(QColor::fromRgb(0,0,0)));
 QTextOption to = QTextOption(Qt::AlignRight | Qt::AlignBottom);
 painter->drawText(option.rect, index.data(Qt::DisplayRole).toString(), to);
}
 

Спасибо.
« Последнее редактирование: Апрель 05, 2012, 08:57 от interv » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 05, 2012, 11:34 »

Выключи редактирование у QTableView:
Код
C++ (Qt)
tv->setEditTriggers( QAbstractItemView::NoEditTriggers );
Записан

Qt 5.11/4.8.7 (X11/Win)
interv
Гость
« Ответ #2 : Апрель 05, 2012, 11:49 »

Не помогло, тоже самое.
проблемма появляется при QTableView::setGridStyle(Qt::NoPen);
без этого параметра все норм...
Но мне не нужны линии гридов ((
« Последнее редактирование: Апрель 05, 2012, 12:01 от interv » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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