Создаю делегат 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);
}
Спасибо.
Не помогло, тоже самое.
проблемма появляется при QTableView::setGridStyle(Qt::NoPen);
без этого параметра все норм...
Но мне не нужны линии гридов ((