Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Циклическое выделение элементов 
:(
    Опции темы
Brodyaga
Дата 18.10.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Всем привет! Имеется два списка с разными моделями. При выделении элемента в одном списке должен выделятся определённый элемент из второго списка и наоборот.

Если в обоих списках добавить слот завязанный на сигнал currentChanged(const QModelIndex &current, const QModelIndex &previous) модели выделения противоположного списка(слот первого списка завязать на сигнал модели выделения  второго списка и наоборот), то получается зацикливание, так как в слоте происходит выделение текущего индекса и следовательно новая эмуляция сигнала currentChanged.

Код


class MyListView: public QListView
{
 Q_OBJECT

 public slots:
    myCurrentChanged(const QModelIndex &current, const QModelIndex &previous)
   {
     this->setCurrentIndex(model()->index(current.row(),current.column(),QModelIndex()));
   }
}

class MyListView2: public QListView
{
 Q_OBJECT

 public slots:
    myCurrentChanged(const QModelIndex &current, const QModelIndex &previous)
   {
     this->setCurrentIndex(model()->index(current.row(),current.column(),QModelIndex()));
   }
}

...

MyListView myListView=new MyListView();
MyListView2 myListView2=new MyListView2();

MyModel* myModel=new MyModel();
MyModel2* myModel2=new MyModel2();

myListView->setModel(myModel);
myListView2->setModel(myModel2);

connect(myListView->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
myListView2, SLOT(myCurrentChanged(const QModelIndex &,const QModelIndex &)));

connect(myListView2->selectionModel(), SIGNAL(currentChanged(const QModelIndex &,const QModelIndex &)),
myListView, SLOT(myCurrentChanged(const QModelIndex &,const QModelIndex &)));

...


Как быть?

Это сообщение отредактировал(а) Brodyaga - 18.10.2010, 17:00
PM MAIL   Вверх
SABROG
Дата 18.10.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Попробуй так:

Код

myCurrentChanged(const QModelIndex &current, const QModelIndex &previous)
{
    QModelIndex index = currentIndex();
    if (index.row() != current.row() || index.column() != current.column())
        setCurrentIndex(model()->index(current.row(), current.column()));
}


Это сообщение отредактировал(а) SABROG - 18.10.2010, 21:16


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Brodyaga
Дата 19.10.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



SABROG, так получается всеровно один лишний вызов слота - От модели выделения первого списка сигнал идёт во второй список, затем от модели выделения второго списка сигнал идёт в первый список и там цепочка обрывается. А можно ли как то сделать чтобы цепочка обрывалась уже на втором списке и сигнал от него обратно в первый уже не шёл? К примеру, чтобы както вызывалось:
this->setCurrentIndex(model()->index(current.row(),current.column(),QModelIndex())); , но сигнал currentChanged не emit'ился? какнибудь его заблокировать можно?
PM MAIL   Вверх
SABROG
Дата 19.10.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Можно попробовать вызывать блокировку эмитинга сигналов для конкретного объекта:

Код

selectionModel()->blockSignals(true);
setCurrentIndex(model()->index(current.row(), current.column()));
selectionModel()->blockSignals(false);


Только вот нет никакой уверенности, что внутри QItemSelectionModel не используются какие-нибудь внутренние служебные сигналы.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Brodyaga
Дата 19.10.2010, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Хм.. А может попровать обойти проблему с другой стороны... Пример с двумя списками я привёл для простоты. На самом деле у меня дерево(QTreeView) и список(QListView). В списке показываются дочерние элементы выбранного элемента в дереве, если они конечно есть, а если нет(в дереве выбран элемент без дочерних узлов) то показываются дочернии элементы, родителя, выбранного в дереве элемента(тоесть сам выбранный элемент в дереве тоже будет выбран и в списке и будет находится в списке вместе с элементами находящимися на одном уровне с ним в дереве).
Можно ли при таком раскладе использовать одну модель и для дерева и для списка? Можно ли както модифицировать список, чтобы он показывал дочернии узлы заданного объекта из модели?
Если можно, то тогда проблема ушла бы сама собой, так как можно было бы спокойно задать одну модель выделения для списка и для дерева..

Это сообщение отредактировал(а) Brodyaga - 19.10.2010, 13:09
PM MAIL   Вверх
Brodyaga
Дата 20.10.2010, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



SABROG, можно ли использовать одну модель и для дерева и для списка? Можно ли както модифицировать список, чтобы он показывал дочернии узлы заданного объекта из модели, а не только дочерние узлы верхнего элемента?

Это сообщение отредактировал(а) Brodyaga - 20.10.2010, 09:59
PM MAIL   Вверх
Brodyaga
Дата 25.10.2010, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Кто-нибудь знает как разделить одну модель между двумя представлениями(дерево, список) ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0765 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.