Настройка отображение итема в QTreeView

98
10 февраля 2021, 23:30

Нужно чтобы в QTreeView каждый итем отображался примерно так:

Т.е, нужно чтобы за первой иконкой был расположен текст, если текст не вмещается в оставшуюся длину итема, то нужно ставить многоточие, сразу после текста должно влезть второе изображение.

Я сделал так:

void TreeDelegate::paint(QPainter* painter, const QStyleOptionViewItem& a_option, const QModelIndex& index) const
{
    QStyleOptionViewItem option = a_option;
    QString displayText = index.model()->data(index, Qt::DisplayRole).toString();
    QPixmap icon;
    QPixmap mark;
    ...
    painter->save();
    int itemWidth = option.rect.width();
    int itemHeight = option.rect.height();
    int itemX = option.rect.x();
    int itemY = option.rect.y();
    int iconWidth = icon.rect().width();
    int iconHeight = icon.rect().height();
    int markWidth = mark.rect().width();
    int markHeight = mark.rect().height();

    //icon
    {
        int targetX = itemX + 2;
        int targetY = itemY + (itemHeight - iconHeight) / 2;
        QRect targetRect( targetX, targetY, iconWidth, iconHeight );
        drawDecoration( painter, option, targetRect, icon );
    }
    //text
    {
       int targetX = (itemX + 2) + iconWidth + (2);
       int targetY = option.rect.y();
       int width = 100; //Длинна текста
       int height = option.rect.height();
       QRect targetRect( targetX, targetY, width, height );
       drawDisplay( painter, option, targetRect, "fasdfsdfsdfsadfsdfasd");
    }

    //mark
    {
        int targetX = (itemX + 2) + iconWidth + (2) + 100 + 2;
        qreal targetY = itemY + (itemHeight - markHeight) / 2;
        QRect targetRect( targetX, targetY, markWidth, markHeight );
        drawDecoration( painter, option, targetRect, mark );
    }

    drawFocus( painter, option, option.rect );
}

Проблема в том, что у меня размер прямоугольника, в котором располагается текст, - фиксирован. А нужно его как-то рассчитать чтобы использовать всю длину итема.

Второй момент: TreeDelegate наследуется от QItemDelegate, а если будет нужно наследоваться от QStyledItemDelegate. Там функций drawDecoration и drawDisplay нет. Или нужно все вручную делать с помощью QPainter?

Нельзя ли этот элемент в дизайнере нарисовать, а в коде только текст и иконки задавать?

READ ALSO
Проблемы с ресемплингом аудио данных

Проблемы с ресемплингом аудио данных

Столкнулся с проблемой аудио-ресемплинга, точнее не совсем понятной логикой работы функци swr_convert_frame

92
Сортировка по алфавиту и по приоритету

Сортировка по алфавиту и по приоритету

Сделал сортировку фамилий пузырьком по алфавиту , но не удаётся сделать по приоритету (Статус)Суть моей задачи в том, что надо вводимую информацию...

125
Как найти путь src картинки по числу в data

Как найти путь src картинки по числу в data

Хочу расписать весь принцип работы просмотра изображений, который я на половину смог сделать

120
Слайдер работает по разному

Слайдер работает по разному

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

92