Russian Qt Forum
Ноябрь 25, 2024, 18:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: центрирование отображения папок в Listview  (Прочитано 14721 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #15 : Февраль 20, 2015, 22:38 »

наследуешься от QStyledItemDelegate, переопределяешь paint(), текст рисуется примерно так:
Код
C++ (Qt)
painter->drawText(option.rect, Qt::TextWordWrap | Qt::AlignHCenter | Qt::AlignVCenter, index.data().toString());

ну и делегат не забудь установить в свою вьюшку.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #16 : Февраль 21, 2015, 08:45 »


вообщем создал класс с++ наследник от QStyledItemDelegate

mydelegate.h
Код:
#ifndef MYDELEGATE_H
#define MYDELEGATE_H

#include <QStyledItemDelegate>
#include <QPainter>


class mydelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit mydelegate(QObject *parent = 0);

signals:

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

};

#endif // MYDELEGATE_H


mydelegate.cpp
Код:
#include "mydelegate.h"

mydelegate::mydelegate(QObject *parent) :
    QStyledItemDelegate(parent)
{
}

void mydelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());
    painter->drawText(option.rect,Qt::TextWordWrap | Qt::AlignHCenter | Qt::AlignVCenter,index.data().toString());

    QStyleOptionViewItemV4 opt = option;
    initStyleOption(&opt, index);

    const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
    QStyle *style = widget ? widget->style() : QApplication::style();
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);


    //QStyledItemDelegate::paint(painter,option,index);
}


и начал переопределять как вы сказали paint
Код:
void mydelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());
    painter->drawText(option.rect,Qt::TextWordWrap | Qt::AlignHCenter | Qt::AlignVCenter,index.data().toString());

    QStyleOptionViewItemV4 opt = option;
    initStyleOption(&opt, index);

    const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
    QStyle *style = widget ? widget->style() : QApplication::style();
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);


    //QStyledItemDelegate::paint(painter,option,index);
}


соответственно две ошибки
/manager20feb/manag20feb/manag/mydelegate.cpp:15: ПЫЙВЛБ: incomplete type 'QStyledItemDelegatePrivate' used in nested name specifier


/manager20feb/manag20feb/manag/mydelegate.cpp:16: ПЫЙВЛБ: incomplete type 'QApplication' used in nested name specifier

в двух строоках
Код:
const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
QStyle *style = widget ? widget->style() : QApplication::style();
что может быть ?

я разобрался вообщем мне не понятно откуда это
Код:
QStyledItemDelegatePrivate::widget(option);
QStyledItemDelegatePrivate--- вообще это что и как его подцепить?
« Последнее редактирование: Февраль 21, 2015, 10:18 от koldun90 » Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #17 : Февраль 21, 2015, 11:14 »

а если я пишу вот так вот
Код:
void mydelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    
    painter->drawText(option.rect,Qt::TextWordWrap | Qt::AlignHCenter | Qt::AlignVCenter,index.data().toString());
    QStyledItemDelegate::paint(painter,option,index);
}

то получается такая картина
« Последнее редактирование: Февраль 21, 2015, 11:16 от koldun90 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #18 : Февраль 21, 2015, 16:17 »

QStyledItemDelegatePrivate — вроде по названию должно быть понятно, что это недоступный извне исходников класс.

QStyledItemDelegate::paint(painter,option,index); вызывать не нужно — это выполняет дефолтную отрисовку.

тебе еще надо определить размер в QStyledItemDelegate::​sizeHint() по идее.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #19 : Февраль 21, 2015, 17:20 »

Код:
void mydelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   
    painter->drawText(option.rect,Qt::TextWordWrap | Qt::AlignHCenter | Qt::AlignVCenter,index.data().toString());

}
вообщем если делаю вот так сами папки не отрисовываются .Отрисовывается только названия папок и файлов.
Я так понял должен быть метод который отрисовывает папки...

Код:
QStyledItemDelegate::​sizeHint(option,index)
возвращает QSize...
я должен передать я так понял в метод который рисует саму папку?
ща попробую перевести доку...
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #20 : Февраль 21, 2015, 17:58 »

я делаю так

Код:
void mydelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{


      
    painter->save();  // в доке написано что нужно вызывать до рисовки
        QStyleOptionViewItemV4 opt = option;
        initStyleOption(&opt, index);

        painter->drawText(option.rect,Qt::TextWordWrap | Qt::AlignHCenter | Qt::AlignVCenter,index.data().toString());
        QStyledItemDelegate::sizeHint(option,index);
        painter->restore();  // после завершения рисовки


}
в доке про паинт написано использовать до начало рисования
Код:
painter->save(); 
а после рисовки   
Код:
painter->restore();
также как я понял нужно использовать  
Код:
initStyleOption(&opt, index);
вопрос а чем же рисовать саму папку?
« Последнее редактирование: Февраль 21, 2015, 18:00 от koldun90 » Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #21 : Февраль 21, 2015, 18:25 »

вроде вот разобрался
Код:
void mydelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QPixmap icon(":/Icon/icon/kde_folder24.png");
    painter->save();

    QStyleOptionViewItemV4 opt = option;
    initStyleOption(&opt, index);
    painter->drawPixmap(option.rect,icon);
    painter->drawText(option.rect,Qt::TextWordWrap | Qt::AlignHCenter | Qt::AlignVCenter,index.data().toString());
    QStyledItemDelegate::sizeHint(option,index);
    painter->restore();
}


но получается такая картина

это немного не то....
     
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #22 : Февраль 21, 2015, 22:12 »

ну так вместо option.rect подставляй нужный прямоугольник для иконки и текста, координаты вычислить несложно.

иконка по идее должна быть где-то в самом Qt и отрисовываться стандартным образом, необязательно тащить для этого кастомную.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #23 : Февраль 21, 2015, 22:34 »

вот таки вопрос как вычислить координаты??

я знаю что иконка моя 24 на 24....
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #24 : Февраль 21, 2015, 23:57 »

ну (0,0) - верхний левый угол. если твоя иконка сидит в этом углу, значит ее rect (0, 0, 24, 24).

текст находится под иконкой, значит его у-координата равна icon.y+icon.height (ну или чуть больше, если отступ понадобится), ну а начинается он от левого края (т.е. х == 0). ширина равна всей доступной ширине, а высота вычисляется как общая высота минус text.y.

если иконка по ширине меньше доступной ширины, то думаю отцентрировать ее по горизонтали труда не составит.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #25 : Февраль 22, 2015, 07:51 »

как я понял нужно сделать так
Код:
painter->drawPixmp(QRect(0,0,24,24),icon);
painter->drawText(QRect(0,icon.height(),  ,   ),Qt::TextWordWrap | Qt::AlignHCenter | Qt::AlignVCenter,index.data().toString());

но я не понял как вычислить ширину текста и его высоту....
можно подробнее?

вы пишите
Цитировать
ширина равна всей доступной ширине
---это каким методом нужно воспользоваться чтоб вычислить?
Цитировать
, а высота вычисляется как общая высота минус text.y5
--общую высоту как вычислять??
вообщем как вычислить "общую высоту" и "доступную ширину"...
нет что то вы мне не то сказали по поводу координат x и y....
у меня файловая система подгружает же в листвиев
и если QRect(0,0,24,24) - для иконки то все иконки в одной точке...
« Последнее редактирование: Февраль 22, 2015, 08:19 от koldun90 » Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #26 : Февраль 22, 2015, 08:22 »

Цитировать
иконка сидит в этом углу
в том то и дело ничего не сидит в углу
смотрите 2 сообщение темы это же файловая система....
и она должна быть распределена (ну ваш кеп)
и того координаты х и y должны будут вычисляться как то динамически....
так в итоге как посчитать координаты то?
« Последнее редактирование: Февраль 22, 2015, 08:30 от koldun90 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Февраль 22, 2015, 09:36 »

ну (0,0) - верхний левый угол...
Все это хорошо, но кто/как будет собственно центрировать? Когда дело дошло до рисования - rect уже определен. Хорошо, в стиле наверняка есть возможность его пересчитать - но как обеспечить желаемую "ровность"? Напр в 1 иконке оказалось много текста, и нужно чтобы вся строка (и/или весь столбец) равнялись на макс ширину/высоту. Где это задать?

2koldun90 Во-первых, текст "не бесконечен". Попробуйте в Вындоуз увеличивать имя файла - скоро оно все-таки обрежется. Во-вторых, Вы взяли довольно мерзкую задачу Улыбающийся У меня была схожая проблема - договорился с заказчиком "оставить как есть", жалко тонны времени. Ну и в третьих - не надо все время спрашивать типа "а что мне делать?", "что мне делать?"  Улыбающийся
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #28 : Февраль 22, 2015, 11:09 »

вы советуете не париться по поводу что имена длинных папок и файлов обрываются и типо сказать и так сойдет
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Февраль 22, 2015, 14:56 »

вы советуете не париться по поводу что имена длинных папок и файлов обрываются и типо сказать и так сойдет
Да вполне (аттач). Равнять "и по строке и по столбцу" - ну это проблематично, да и времени жалко разбипаться. Тоже мне, "типо-добросовестный"  Улыбающийся

Edit: и для полноты картины - второй аттач. Тут все "ровно", но разбазаривается место
« Последнее редактирование: Февраль 22, 2015, 15:12 от Igors » Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.316 секунд. Запросов: 23.