QTreeView не показывает заголовок


Я показываю TreeView с пользовательской моделью sortfilterproxymodel (которая принимает другую пользовательскую модель в качестве источника) и пользовательским делегатом (перезаписанный paint), чтобы повлиять на отображение каждого элемента.

Однако я не могу получить заголовок TreeView, чтобы показать. Я посмотрел как на прокси, так и на нормальную модель, и у обоих есть вызов headerData() и возврат правильных значений. Я не скрываю явно заголовок. На самом деле, я явно показываю () заголовок TreeView и setHeaderHidden () в false.

Что может привести к тому, что заголовок не будет показан?

Вот функция paint () делегата, так как я подозреваю ошибку где-то там:

//---------------------------------------------------------------------------------
void
MyDelegate::paint(QPainter* p_painter, const QStyleOptionViewItem& p_option, const QModelIndex& p_index) const
{
    // Get a custom text
    QString text = "";

    // Code that changes the text variable, nothing fancy, no pre-mature return
    // Left out for convenience

    // Call painter methods for drawing
    p_painter->save();
    p_painter->setClipRect(p_option.rect);

    drawBackground(p_painter, p_option, p_index);
    drawDisplay(p_painter, p_option, p_option.rect, text);
    drawFocus(p_painter, p_option, p_option.rect);

    p_painter->restore();
}

Если вам интересно, почему я делаю все эти вещи художника (save (), drawBackground и т. д.) вручную, потому что это, кажется, единственный способ изменить отображаемый текст внутри функции paint (). По крайней мере, единственный, кого я смог вычислить. Но я не знаю, имеет ли это какое-то отношение к заголовку. показывается в представлении.

Edit: к настоящему времени я попытался заменить свою собственную краску на краску по умолчанию. Заголовок все еще не показан, поэтому метод paint() кажется невинным ;)

1 2

1 ответ:

Проблема заключалась в том, что я "забыл" добавить в начало функции headerData() следующее:

if (role != Qt::DisplayRole)
    return QVariant();
Хотя я должен сказать, что это немного странно, что у вас должны быть эти строки, чтобы отобразить что-либо вообще. Если они требуются таким образом, почему бы не сделать эту проверку перед вызовом headerData ()?

В любом случае, я надеюсь, что это может помочь некоторым людям с той же проблемой:)