@tschin

Как в делегате переопределить метод paint()?

Здравствуйте! Есть QTableWidget. Для некоторых колонок и строк есть делегаты. В делегатах данные динамически изменяются. Чтобы отобразить изменение этих данных помимо добавление их в делегат приходится еще в цикле проходить по ячейкам таблицы и изменять QTableWidgetItem. Хочется не ходить по ячейкам в цикле. Для того, чтобы данные после добавления в делегат сразу отображались, я так понимаю, нужно переопределить виртуальный метод paint(). Никак не могу понять как это сделать.

В качестве примера использовал вот этот материал.

Вот что у меня получилось:

void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QString itemText = index.data().toString();
    QStyleOptionViewItem viewItem;
    QRect r = option.rect;
    r.setHeight( option.rect.height() );
    r.moveCenter( option.rect.center() );
    viewItem.rect = r;
    viewItem.displayAlignment = Qt::AlignCenter;
    viewItem.text= itemText;
    QItemDelegate::paint( painter, option, QModelIndex() );
}


Падает с предупреждениями:

ASSERT: "index.isValid()" in file itemviews\qitemdelegate.cpp, line 392
QWidget::repaint: Recursive repaint detected
ASSERT: "index.isValid()" in file itemviews\qitemdelegate.cpp, line 392
D:\Qt_project\new-conf\new_conf\debug\new_conf.exe завершился с кодом 3
  • Вопрос задан
  • 872 просмотра
Решения вопроса 1
@tschin Автор вопроса
Вот такой вариант работает как надо:

void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QString itemText = index.data().toString();

    QStyleOptionViewItem optionViewItem;
    optionViewItem.text = itemText;
    optionViewItem.rect = option.rect;

    QApplication::style()->drawItemText(painter,
                                        optionViewItem.rect,
                                        Qt::AlignCenter,
                                        QApplication::palette(),
                                        true,
                                        optionViewItem.text);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы