Метод подкласса Qt QStyledItemDelegate никогда не вызывается - PullRequest
0 голосов
/ 01 мая 2011

Обновление: мой метод рисования не был постоянным

У меня есть пользовательский QTableView, подключенный к QAbstractTableModel.

Я недавно создал подкласс QStyledItemDelegate, и его метод paint печатает сообщение отладки, а затем вызывает родительскую краску и затем печатает другое сообщение отладки.

Я позвонил view->setItemDelegate и проверил, что делегат предмета, на мой взгляд, тот, который я ему дал (просто чтобы быть уверенным).

Однако, моя программа просто воспроизводит вещи так же, как и раньше, и никогда не печатает отладочное сообщение в paint. Он печатает отладочное сообщение в конструкторе делегата, поэтому я знаю, что оно должно печататься, если эта функция когда-либо будет вызвана.

Вот урезанная версия моего кода, дайте мне знать один из них:

  1. Вы видите, что не так?
  2. Как я могу отлаживать классы Qt следующим образом?
  3. Какой другой соответствующий код я должен опубликовать для диагностики этой проблемы?
  4. Есть ли какое-то общее решение, которое я мог бы попробовать?

Спасибо!

Вот все файлы делегатов .h и .cpp (минус включает / namespace)

class QtCellItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT;
public:
    QtCellItemDelegate( QWidget *parent = NULL );

    void paint( QPainter *painter,
                const QStyleOptionViewItem &option,
                const QModelIndex &index );

    QSize sizeHint( const QStyleOptionViewItem &option,
                    const QModelIndex & index ) const;

    virtual ~QtCellItemDelegate();
};

QtCellItemDelegate::QtCellItemDelegate( QWidget *parent ) :
    QStyledItemDelegate( parent )
{
    qDebug() << "CONSTRUCT";
}

void QtCellItemDelegate::paint( QPainter *painter,
                                const QStyleOptionViewItem &option,
                                const QModelIndex &index )
{
    painter->save();
    qDebug() << "Begin Paint";
    QStyledItemDelegate::paint( painter, option, index );

    qDebug() << "   Begin custom paint";
    // omitted...

    qDebug() << "End paint";
    painter->restore();
}

QSize QtCellItemDelegate::sizeHint( const QStyleOptionViewItem &option,
                                     const QModelIndex & index ) const 
{
    return QSize( 60, 60 );
}

QtCellItemDelegate::~QtCellItemDelegate()
{
    qDebug() << "Destroy delegate!";
}

Итак, выходные данные отладки говорят мне, что конструктор вызван (но не деструктор ...), и что я на самом деле устанавливаю тот же показатель удаления для представления, какой я себя считаю. Однако сообщения в paint никогда не печатаются.

1 Ответ

2 голосов
/ 01 мая 2011

Я думаю, что ваша проблема в том, что вы не объявляете метод рисования вашего подкласса как const.Таким образом, он не переопределяет метод суперкласса (считается, что константные и неконстантные методы имеют разные подписи друг от друга), и поэтому ваш метод рисования не вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...