LINUX.ORG.RU

Переход от QScrollArea к QGraphicsView (Продолжение)

 


0

1

Напомню проблему, которую решал в прошлый раз

Все стало очень круто работать, но вот наткнулся на проблему, которую никак не могу решить, итак, есть код

substrate = new QFrame();
substrate -> setObjectName("visitorListSubstrate");
areaFrameLay = new QVBoxLayout(substrate);
areaFrameLay -> setMargin(0);
areaFrameLay -> setSpacing(0);
areaFrameLay -> addStretch();

scene = new QGraphicsScene(this);
proxySubstrate = scene -> addWidget(substrate);
proxySubstrate -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

area = new QGraphicsView(scene, this);
area -> setObjectName("VisitorListArea");
area -> setAlignment(Qt::AlignLeft | Qt::AlignTop);
area -> setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
area -> verticalScrollBar() -> setObjectName("chatsScrollBar");

...


void MyClass::resizeEvent(QResizeEvent *e) {
    QFrame::resizeEvent(e);
    QSizeF  size = proxySubstrate -> size();
    size.setWidth(area -> width() - 9);
    proxySubstrate -> resize(size);
}

...
areaFrameLay -> insertWidget(index, item);

Вот в таком режиме все хорошо отображается, а содержимое подложки растягивается вместе с приложением, однако, в этом случае при добавлении ~ 1000 ячеек приложение падает с ошибкой

invalid parameter passed to c runtime function qt
Вижу, что происходит это в QtCore -> msvcr. Причем, если убрать обработку resizeEvent, то приложение работает отлично, но тогда у меня ячейки не растягиваются (а мне без этого никак)... М.б. есть какой то другой способ указать виджету на сцене, чтобы он занял все свободное пространство...

Ответ на: комментарий от grondek

В том то и дело, что нет, достаточно просто закоментить

void MyClass::resizeEvent(QResizeEvent *e) {
    QFrame::resizeEvent(e);
    //QSizeF  size = proxySubstrate -> size();
    //size.setWidth(area -> width() - 9);
    //proxySubstrate -> resize(size);
}
И уже ничего не падает...

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

А повторение вот этих строчек два раза подряд

scene = new QGraphicsScene(this);
proxySubstrate = scene -> addWidget(substrate);

Это в коде так написано?

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

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

А попробуй программу (в т.ч. падающий вариант) под valgrind погонять, что будет? Метод лобовой - но часто довольно эффективный.

Ещё можно навтыкать qDebug-ов и посмотреть, не вызывается ли resizeEvent ДО инициализации proxySubstrate, я бы это проверил в первую очередь. И проверка указателя на нуль там, в общем, не помешает (хотя если это разрушение - не поможет).

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Ещё можно навтыкать qDebug-ов и посмотреть

Понимаешь какое дело, приложение не падает сразу, оно постоянно добавляет ячейки, и в какой то момент просто вылетает...Если бы обращение к null было бы, то я бы это отловил уже...Тут самое интересное, что приложение падает не в момент resizeEvent а в другой... Т.е. если во время загрузки не поизменять размеры, то оно и не упадет, а если поизменять, то оно еще какое-то время поработает и упадет... Ща попробую понаставить qDebug

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

К сожалению, второй вариант подтвердить гораздо тяжелее, чем первый

Обернуть в QPointer, да и всё.

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