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  


Есть у кого-нить предположения по этому поводу?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 28.12.2024, 10:37