Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: troorl от Февраль 01, 2007, 21:58



Название: Очень странное поведение QListWidget
Отправлено: troorl от Февраль 01, 2007, 21:58
Уже начинаю терять веру в логику...
В общем суть проблемы такова: если добавлять в этот виджет два элемента - он работает, а если три - то программа компилируется, но не запускается... Вот выдержка из кода:
Основные элементы сделаны в качестве массивов:
Код:
paintWidget *pWidget[];
frameStruct *fram[];
QListWidgetItem *__item[];

Сначала объявляю QListWidget:
Код:
    listWidget = new QListWidget(centralwidget);
    listWidget->setObjectName(QString::fromUtf8("listWidget"));
    listWidget->setGeometry(QRect(0, 460, 801, 121));
    listWidget->setIconSize(QSize(100, 100));
    listWidget->setTextElideMode(Qt::ElideNone);
    listWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
    listWidget->setFlow(QListView::LeftToRight);
    listWidget->setLayoutMode(QListView::SinglePass);
    listWidget->setViewMode(QListView::ListMode);

Затем создаю виджеты, в которых рисуется определённая картинка и графические примитивы. Таких виджетов я могу создать сколько угодно и всё отлично рисуется:
   
Код:
pWidget[0] = new paintWidget(frameGraph);
    int w_s, h_s = 100;
    w_s = h_s * fram[0]->width / fram[0]->height;
    pWidget[0]->setPicture(w_s, h_s, fram[0]);

    pWidget[1] = new paintWidget(frameGraph);
    pWidget[1]->setPicture(w_s, h_s, fram[1]);

Дальше я создаю элементы QListWidgetItem и в качестве иконки вставляю в них сграбленный виджет pWidget:
Код:
    __item[0] = new QListWidgetItem(listWidget);
    __item[0]->setIcon(QIcon(QPixmap::grabWidget(pWidget[0])));

    __item[1] = new QListWidgetItem(listWidget);
    __item[1]->setIcon(QIcon(QPixmap::grabWidget(pWidget[1])));

До сюда всё нормально. Но как только я добавляю третий элемент - программа не стартует. Причём необязательно совать в него иконку - достаточно просто создать. Сначала делал это в цикле. Затем вот решил проверить поштучно.

Может кто-то понимает логику происходящего? :oops:

добавлено спустя:

 Ну и хит сезона: если добавлять третий элемент не из массива __item[], а просто, скажем, item1, то всё работает... Это как понимать?? Что, тот массив не может хранить больше двух элементов??


Название: Очень странное поведение QListWidget
Отправлено: Вячеслав от Февраль 01, 2007, 22:53
Память-то под массивы выделяеться ? Тафай весь весь код ;) А то как сейчас нарисовано оно вообща в кору падать должно ;)


Название: Очень странное поведение QListWidget
Отправлено: troorl от Февраль 01, 2007, 23:14
Цитата: "Вячеслав"
Память-то под массивы выделяеться ? Тафай весь весь код ;) А то как сейчас нарисовано оно вообща в кору падать должно ;)

Афигеть! Указал явно размерность массива - заработало)))
Странно, почему другие массивы не сегфолтили программу...

Может посоветуете более логичное и мощное средство для хранения массивов, чем стандартный сишный массив?


Название: Очень странное поведение QListWidget
Отправлено: Dendy от Февраль 01, 2007, 23:47
Не падало от двух елементов по счастливой случайности. Память, вьІделенная под екземпляр класса имеет размер. В Вашем случае обращение за предельІ массива просто привело к использованию другого куска памяти етого же класса, что отвелся, например, под *fram[] или *__item[]. Обращение еще дальше - фактически запись мусора по несуществующему адресу, иньІми словами segfault.

Юзайте стандартньІе Qt контейнерьІ:

Код:
QList<QListWidgetItem*> items_;
...
QListWidgetItem * item = new QListWidgetItem( list_widget );
item->setSomething( ... );
items_ << item;


Название: Очень странное поведение QListWidget
Отправлено: nova от Февраль 01, 2007, 23:50
Цитировать

Афигеть! Указал явно размерность массива - заработало)))
Странно, почему другие массивы не сегфолтили программу...
:shock:
Очень странно .. должны были  :P
Цитировать
Может посоветуете более логичное и мощное средство для хранения массивов, чем стандартный сишный массив?

Смотри в асистенте Generic Containers


Название: Очень странное поведение QListWidget
Отправлено: troorl от Февраль 04, 2007, 17:15
Спасибо больше всем ответившим, вы мне очень помогли. Но у меня появилось ещё несколько вопросов:
1. Я использую QListWidget для отображения списка картинок. Текста там нет. Но всё-равно с той стороны, где он должен быть, отступ немного больше, чем с противоположной. То есть, когда выделяешь элемент, то видно, что справа промежуток между картинкой и концом выделения больше, чем слева. Как это можно решить?
2. Как вообще избавится от отступов между элементами?
3. Какой сигнал отвечает за выделение элемента? Чтобы он возникал каждый раз, когда выделение меняется, не зависимо от того, каким образом это делается - мышкой, клавиатурой, программно... Перепробовал все сигналы, которые принимали параметром QListWidgetItem - не нашёл такого. Допустим, я с клавиатуры стрелками перевожу выделения с элемента на элемент - и сигнала нет. Нужно нажимать каждый раз Enter.
4. Как проще всего реализовать контекстное меню для каждого элемента? Наследовать или можно уже на готовеньком?

Заранее благодарен :)