crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTreeWidget повреждения кучи, внезапная остановка приложения
Phoenix_nsk
  опции профиля:
сообщение 12.3.2011, 18:31
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 12.3.2011
Пользователь №: 2491

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть объект типа иерархическое дерево (QTreeWidget).
При нажимании буквенных клавиш должен осуществляться переход на совпадающую ветку (по умолчанию). Этот момент мною никак не изменялся, поэтому очень сильно удивляет следующее:

"ОС Windows имициировала точку останова в conf_dev.exe.
Это может быть вызвано повреждением кучи и указывает на ошибку в conf_dev.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит conf_dev.exe"

Это происходит в debug на win7, release же вообще падает.
Что ещё боле странно - на winXP всё работает нормально, т.е. переходит к нужному элементу.

Клавиши стрелочки работают, исключение происходит только на буквенных.

Debug после остановки открывает qregion.cpp и указывает на последнюю строчку в функции:

Раскрывающийся текст
bool qt_region_strictContains(const QRegion &region, const QRect &rect)
{
if (isEmptyHelper(region.d->qt_rgn) || !rect.isValid())
return false;

#if 0 // TEST_INNERRECT
static bool guard = false;
if (guard)
return false;
guard = true;
QRegion inner = region.d->qt_rgn->innerRect;
Q_ASSERT((inner - region).isEmpty());
guard = false;

int maxArea = 0;
for (int i = 0; i < region.d->qt_rgn->numRects; ++i) {
const QRect r = region.d->qt_rgn->rects.at(i);
if (r.width() * r.height() > maxArea)
maxArea = r.width() * r.height();
}

if (maxArea > region.d->qt_rgn->innerArea) {
qDebug() << "not largest rectangle" << region << region.d->qt_rgn->innerRect;
}
Q_ASSERT(maxArea <= region.d->qt_rgn->innerArea);
#endif

const QRect r1 = region.d->qt_rgn->innerRect;
return (rect.left() >= r1.left() && rect.right() <= r1.right()
&& rect.top() >= r1.top() && rect.bottom() <= r1.bottom());
}


Qt 4.7.1

------------------------------------------------------------------------------------------------------


Решил провести тест и написал простой код:

Раскрывающийся текст
int main(int argc, char *argv[])
{
QApplication p(argc, argv);
QTreeWidget twg;
QStringList lst;

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("CP1251"));

lst << "Folders" << "Used space";
twg.setHeaderLabels(lst);
twg.setSortingEnabled(true);

QTreeWidgetItem *pItem = new QTreeWidgetItem (&twg);
pItem->setText(0, "Диски");

QTreeWidgetItem *a = new QTreeWidgetItem (pItem);
a->setText(0, "Арбуз");
a = new QTreeWidgetItem (pItem);
a->setText(0, "Ананас");
a = new QTreeWidgetItem (pItem);
a->setText(0, "Вода");
a = new QTreeWidgetItem (pItem);
a->setText(0, "Водка");
a = new QTreeWidgetItem (pItem);
a->setText(0, "Сода");
a = new QTreeWidgetItem (pItem);
a->setText(0, "Елка");
a = new QTreeWidgetItem (pItem);
a->setText(0, "F");
a = new QTreeWidgetItem (pItem);
a->setText(0, "Line");
a = new QTreeWidgetItem (pItem);
a->setText(0, "Label");

twg.sortItems(0, Qt::AscendingOrder);
twg.setItemExpanded(pItem, true);
twg.resize(220, 350);
twg.show();

return p.exec();
}


Скомпилированное под Qt Creator (4.7.0) работает как надо, т.е. при нажатии кнопок переходит на элемент
Если его же скомпилировать из под вижака (2008), где Qt 4.7.1 - падает.

Что это вообще такое, с чем связано?
И безусловно самое важное - как обойти? :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Phoenix_nsk
  опции профиля:
сообщение 12.3.2011, 19:34
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 12.3.2011
Пользователь №: 2491

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть у кого-нить предположения по этому поводу?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 12.3.2011, 22:58
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(Phoenix_nsk @ 12.3.2011, 18:31) *
Если его же скомпилировать из под вижака (2008), где Qt 4.7.1 - падает.

При пошаговом выполнении на какой строчке валится? Может бага какая в кьюте => есть попробовать Qt Creator + 4.7.1 + win Seven? Или vs + 4.7.2 + win Seven? (4.7.2 это bugfix по сути).


А если попробовать так
int main(int argc, char *argv[])
{
    QApplication p(argc, argv);

    QTreeWidget *twg = new QTreeWidget();

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("CP1251"));

    twg->setHeaderLabels(QStringList() << "Folders" << "Used space");
    twg->setSortingEnabled(true);

    QTreeWidgetItem *pItem = new QTreeWidgetItem (twg, QStringList() << "Диски");
    new QTreeWidgetItem (pItem, QStringList() << "Арбуз");

    twg->sortItems(0, Qt::AscendingOrder);
    twg->setItemExpanded(pItem, true);
    twg->resize(220, 350);
    twg->show();

    return p.exec();
}

?

Сообщение отредактировал Rocky - 12.3.2011, 22:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Phoenix_nsk
  опции профиля:
сообщение 13.3.2011, 8:47
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 12.3.2011
Пользователь №: 2491

Спасибо сказали: 0 раз(а)




Репутация:   0  


Это происходит при одном и том же действии - нажатии клавиши, но в Qt файлах я оказываюсь порой в разных, но итог один и тот же:
ВСЁ ПРИХОДИТ ВОТ СЮДА (dbgheap.c) при debug сборке
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
У QTreeWidget есть ещё метод, видимо он и вызывается при нажатии клавиши
вызов keyboardSearch("str"); тоже приводит к таким последствиям.

--------------------------------------------------------------------

Может быть у кого-нить есть возможность скомпилить мой примерчик и посмотреть у себя что произойдёт?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Phoenix_nsk
  опции профиля:
сообщение 14.3.2011, 16:39
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 12.3.2011
Пользователь №: 2491

Спасибо сказали: 0 раз(а)




Репутация:   0  


Мда, что-то на специализированом ресурсе не много желающих поразбираться в проблеме...

Собственно до чего я докопал... Проблема в сборке Qt, я его пересобираю по вот этой инструкции: Сборка Qt без зависимостей (MS Visual Studio) И на выходе получаю вроде бы как работающую сборку, но оказалось что нет.
Плюсы сборки: можно собирать приложение (релиз) с ключом MT, тогда не нужно таскать с собой никаких dll, кроме Qt'шных, а так по умолчанию стоит MD и есть системы, в которых почему-то приложение не запускается, система пишет, что оно неверно сконфигурировано и поможет только переустановка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 2:17