Russian Qt Forum
Сентябрь 30, 2024, 18:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Очень странное поведение QListWidget  (Прочитано 5527 раз)
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, то всё работает... Это как понимать?? Что, тот массив не может хранить больше двух элементов??
Записан
Вячеслав
Гость
« Ответ #1 : Февраль 01, 2007, 22:53 »

Память-то под массивы выделяеться ? Тафай весь весь код Подмигивающий А то как сейчас нарисовано оно вообща в кору падать должно Подмигивающий
Записан
troorl
Гость
« Ответ #2 : Февраль 01, 2007, 23:14 »

Цитата: "Вячеслав"
Память-то под массивы выделяеться ? Тафай весь весь код Подмигивающий А то как сейчас нарисовано оно вообща в кору падать должно Подмигивающий

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

Может посоветуете более логичное и мощное средство для хранения массивов, чем стандартный сишный массив?
Записан
Dendy
Гость
« Ответ #3 : Февраль 01, 2007, 23:47 »

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

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

Код:
QList<QListWidgetItem*> items_;
...
QListWidgetItem * item = new QListWidgetItem( list_widget );
item->setSomething( ... );
items_ << item;
Записан
nova
Гость
« Ответ #4 : Февраль 01, 2007, 23:50 »

Цитировать

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

Смотри в асистенте Generic Containers
Записан
troorl
Гость
« Ответ #5 : Февраль 04, 2007, 17:15 »

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

Заранее благодарен Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 21.