LINUX.ORG.RU

QListView


0

0

Связал сигнал clicked(QListViewItem *item) с слотом.
Как узнать номер этого элемента. Я посмотрел, все сигналы возвращают QPoint, то есть координаты.

Есть способ получить его номер?
Например: таблица состоит из строк {"Первый", "Второй", "Третий"}
Нажимаю мышкой или клавой на "Второй", получаю 2 или 1, в зависимости от принятых договоренностей...

В общем, не отворачивайтесь от начинающего Unix программера.


попробуйте использовать метод listView (QListView * QListViewItem::listView () const), т.е.

item->listView();

это даст вам возможность обратиться к объекту списка. ну а там - метод isSelected (bool QListView::isSelected ( const QListViewItem * i ) const), т.е.

if( true == item->listView()->isSelected( item ) ) {

...

}

corpus
()

прошу прощения, предыдущее было не совсем по теме - увлёкся. на сколько мне известно, просто получить значение индекса нельзя (нет такого метода). можно придумать несколько вариантов:

а) сделать свой класс, наследованный от ListViewItem, и добавить свойство для индекса. но это свойство придётся менять при сортировке/изменеии/добавлении элементов, причём менять скорее всего придётся не только в одном элементе;

б) использовать итератор с циклом, пока не найдётся этот элемент.

corpus
()
Ответ на: комментарий от corpus

Да, неплохо...
А в QListViewItem может есть какое нибудь неиспользуемое поле?
Типа comment. В него и сохранять индекс при добавлении элементов.

Просто я не знаю как отреагирует QListView при добавлении в него наследника QListViewItem. Думаешь прокатит?

Ty3uK
() автор топика
Ответ на: комментарий от Ty3uK

этот способ красив (и не вижу преград, почему QListView должен плохо реагировать - базовый класс будет QListViewItem, т.е. upcasting преобразование), но проблема может появится, если елементы могут (и будут) добавляться в середину списка. в этом случае надо будет менять это поле у всех элементов, перед которыми будет вставлен новый.

так что, если такое предвидется, то я бы использовал 2-й способ. да и в реализации он проще.

corpus
()
Ответ на: комментарий от corpus

У меня элементы добавляются один раз и не изменяются на протяжении работы программы.
То есть это выглядит так:

class MyQListViewItem: public QListViewItem{
int nymber;
}

Ty3uK
() автор топика
Ответ на: комментарий от Ty3uK

Вот что я делаю:

void first_f::items_gClick(QListViewItem *item) // Наш слот
{
printf("\nItem: %i", item->parent->itemPos()) ;
}

Вот что получаю:

In file included from first_f.cpp:24:
first_f.ui.h: In member function `virtual void
first_f::items_gClick(QListViewItem*)':
first_f.ui.h:34: error: invalid use of member (did you forget the `&' ?)
first_f.ui.h:34: error: base operand of `->' is not a pointer
make: *** [first_f.o] Ошибка 1

Что не так?
И как поступают, когда в слоте необходимо иметь доступ к каким-либо данным пользователя? Лишний параметр не прикрутишь, у глобальные переменный в ООП некрасиво.

Ty3uK
() автор топика
Ответ на: комментарий от Ty3uK

> printf("\nItem: %i", item->parent->itemPos()) ;

в таком случае надо item->itemPos() или item->listView()->itemPos( item ) /* про item->parent()->itemPos( item ) не уверен) */.

corpus
()
Ответ на: комментарий от corpus

printf("\nItem: %i", item->items_g->itemPos(item));

In file included from first_f.cpp:24:
first_f.ui.h: In member function `virtual void
first_f::items_gClick(QListViewItem*)':
first_f.ui.h:35: error: 'class QListViewItem' has no member named 'items_g'
make: *** [first_f.o] Ошибка 1
----------------------------------
printf("\nItem: %i", item->itemPos());

Возвращает в пикселях!!! Значит придется с потомками возится...

Ty3uK
() автор топика
Ответ на: комментарий от Ty3uK

А что если зделать так:
У меня есть массив структуры MyItems, каждому элементу соответствует QListViewItem, что если держать поле-указатель на QListViewItem.
А в слоте пробегать по массиву и сравнивать указатели или проверять isSelect().

Что более корректно? isSelect или ==?

Ty3uK
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.