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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: listWidget: как с каждой строкой хранить произвольный указатель?  (Прочитано 5887 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Май 08, 2011, 17:33 »

К примеру в Делфи у ListBox помимо Strings есть еще классная вещь как Objects, по сути хранится пара строка + произвольный указатель. Как такое реализовать в Qt? все что нашел, это data() для listITem, но как в нем хранить указатель я так и не понял или делать своего наследника?
Записан
Sancho_s_rancho
Гость
« Ответ #1 : Май 08, 2011, 18:28 »

QList<QPair<QString, QPointer> >
Записан
Drafter
Гость
« Ответ #2 : Май 08, 2011, 19:57 »

Если пользуетесь моделями (в данном случае QStandardItemModel), тогда, при создании элемента модели:
Код:
QStandardItem *item = new QStandardItem("Item caption");
item->setData(anyData1, Qt::UserRole + 1);
item->setData(anyData2, Qt::UserRole + 2);
...
model->setItem(rowIdx, colIdx, item);

И, соответственно, извлечение (предположим, что модель привязана к QListView):
Код:
AnyDataType data1 = listView->currentIndex.data(Qt::UserRole + 1).value<AnyDataType>();
AnyDataType data2 = listView->currentIndex.data(Qt::UserRole + 2).value<AnyDataType>();
« Последнее редактирование: Май 08, 2011, 21:13 от Drafter » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Май 08, 2011, 22:01 »

а если не пользуюсь моделью? по сути мне нужно выводить простые строки, но к каждой строке привязан указатель на объект с которым связана эта строка.
Записан
Drafter
Гость
« Ответ #4 : Май 08, 2011, 22:33 »

Тогда пользуйтесь QListWidget и QListWidgetItem.

Вставка элемента с дополнительными данными.
Код:
QListWidgetItem *item = new QListWidgetItem(itemText, listWidget);
item->setData(Qt::UserRole, pointer);

Извлечение.
Код:
PointerType pointer = listWidget->item(rowIndex)->data(Qt::UserRole).value<PointerType>();
« Последнее редактирование: Май 08, 2011, 22:39 от Drafter » Записан
aliks-os
Гость
« Ответ #5 : Май 09, 2011, 12:50 »

Код:
struct IDX {
    QString fldName;
    int non_unique;
    QString index_type;
    int sub_part;
    QString fldType;
};
Q_DECLARE_METATYPE(IDX);

    IDX idx = item->data(Qt::UserRole).value<IDX>();
    QVariant v;
    v.setValue(idx);
    item->setData(Qt::UserRole,v);


Вот тебе примерчик как засунуть любые данные в data. Если покумекаешь, то туда засунеш и указатель...
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Май 09, 2011, 13:04 »

с точки зрения производительности при большом количестве элементов (1000 и выше) как быстро это будет работать?
Не знаю как в Qt, а в Делфи вариантный тип очень тяжелый в плане скорости/объема памяти и я всегда старался его избегать.
Записан
Drafter
Гость
« Ответ #7 : Май 09, 2011, 13:14 »

Вы в каком виде собираетесь список хранить? Если внутри QListWidget, то там элементы (QListWidgetItem) по int-индексу отыскиваются. Что касается памяти, коли приложение десктопное, тогда и париться нечего.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Май 10, 2011, 10:37 »

спасибо, попробую ваш подход.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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