LINUX.ORG.RU

Qt TreeView, кастомный делегат и sizeHint


0

1

Собственно делаю кастомный делегат, где имеется текст и описание, описание должно уметь переносы строк. Так вот с деревьями возникает проблема, что они кешируют sizeHint от делегата и соответственно не запрашивают у него по новой sizeHint в случае ресайза. В итоге это приводит к веселым багам. Как проще всего заставить view перегенерить sizeHint'ы для элементов в случае ресайза? По поводу тормозов можно не волноваться: элементом не будет больше 20

★★★★★

>Как проще всего заставить view перегенерить sizeHint'ы для элементов в случае ресайза?

Вызывать QTreeView::doItemsLayout() в resizeEvent этого view.

summatus
()
Ответ на: комментарий от Gorthauer

Зачем, можно ведь просто отнаследоваться.

UVV ★★★★★
()
Ответ на: комментарий от summatus

Хотя лучше, вместо doItemsLayout, делай так:

    QEvent e( QEvent::StyleChange );
    qApp->sendEvent( this, &e );

где this - твой view, это тоже самое, в принципе, но более корректно.

summatus
()
Ответ на: комментарий от summatus

Круто конечно, но хочется как-то из делегата это научиться делать, чтобы не править каждый view под него.

Gorthauer ★★★★★
() автор топика
Ответ на: комментарий от Gorthauer

делегат один на все view'ы.

Какая разница? Ставишь этот делегат, как фильтр событий всех этих view. Создаёшь фильтр:

class Delegate : public QStyledItemDelegate {
protected:
    bool eventFilter( QObject* obj, QEvent* e ) {
        if ( e->type() == QEvent::Resize ) {
            QEvent e( QEvent::StyleChange );
            qApp->sendEvent( obj, &e );
        }

        return QObject::eventFilter( obj, e );
    }
...

Любому объекту, он, в ответ на resize, прикажет обновить стиль. Можно добавить проверку по objectName: тот ли это view, который нужно перерисовать.

И, кстати, ты спрашивал простой вариант. В серьёзный проект такое засовывать не надо, там надо создавать свой BNWTreeView : public QAbstractItemView.

summatus
()
Ответ на: комментарий от summatus

Ну вот не знаю, можно ли qutIM считать серьезным проектом? К тому же делегата я присобачиваю в том числе и к QComboBox'у, а как у него view поменять не представляю.

Gorthauer ★★★★★
() автор топика
Ответ на: комментарий от Gorthauer

Но, у QComboBox же вид сам перерисовывается при открытии/закрытии, а делегат не влияет на выбранный элемент. Но вообще его можно обновлять например так:

    bool eventFilter( QObject* obj, QEvent* e ) {
        if ( e->type() == QEvent::Resize ) {
            if ( qobject_cast< QTreeView* >( obj ) ) {
                QEvent e( QEvent::StyleChange );
                qApp->sendEvent( obj, &e );
            }
            else if ( QComboBox* cb = qobject_cast< QComboBox* >( obj ) ) {
                QEvent e( QEvent::StyleChange );
                cb->setUpdatesEnabled( false );
                qApp->sendEvent( cb->view(), &e );
                cb->setUpdatesEnabled( true );
            }
        }

        return QObject::eventFilter( obj, e );
    }
summatus
()
Ответ на: комментарий от summatus

Да вроде бы на него тоже влияет QEvent e( QEvent::StyleChange );

Gorthauer ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.