Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: boruh от Апрель 23, 2010, 00:48



Название: [РЕШЕНО] Связывание скроллируемых списков
Отправлено: boruh от Апрель 23, 2010, 00:48
Здравствуйте, коллеги.

Столкнулся с небольшой задачкой:
есть окно, на нем лежат два QListView, в которых выведены одинаковые (или почти одинаковые) списки со значениями. И нужно сделать так, что бы при скроллировании одной из вьюх синхронно скроллировалась вторая. Т.е. эдакий синхронизъм.

Я вообщем-то решил задачу, но как-то шатко все получилось - возникают "провалы", отставания, рассинхронизация и т.д. Хотелось бы узнать ваше мнение по данному вопросу: как лучше реализовать такую синхронность.


Название: Re: Связывание скроллируемых списков
Отправлено: lit-uriy от Апрель 23, 2010, 01:27
Я бы начал экспериментировать так:
на родительском виджете (на котором расположены оба представления) повесил фильтр событий на оба представления. В обработчике фильтра определял какое из представлений получает QWheelEvent, и насколько нужно прокрутить оба представления.
Саму прокрутку обрамил бы в setUpdateEnabled, чтобы визуальных касечков видно не было


Название: Re: Связывание скроллируемых списков
Отправлено: boruh от Апрель 23, 2010, 01:56
Но скроллирование ведь может не только по колесу мыши срабатывать. Может и по нажатию по клавишам на клаве, может и по тасканию ползунка. Хотя все эти события можно так же перехватывать.
Да, еще важный момент, я не совсем правильно описал структуру формы. На форме лежит два QTabWidget, и в каждом из них есть по QListView. Т.е. вьюхи не на самой форме лежат, а в табвиджетах.


Название: Re: Связывание скроллируемых списков
Отправлено: GreatSnake от Апрель 23, 2010, 08:11
lit-uriy
Зачем так усложнять?

boruh
QListView::verticalScrollBar()->valueChanged(int)
QListView::horizontalScrollBar()->valueChanged(int)

Вешаете на каждый QScrollBar слот и синхронизируете значение для другого соответствующего scrollbar-a.
Только нужно или блокировать сигналы или вставить гарды, чтобы избежать рекурсии.


Название: Re: Связывание скроллируемых списков
Отправлено: Kolobok от Апрель 23, 2010, 11:11
Только нужно или блокировать сигналы или вставить гарды, чтобы избежать рекурсии.

Рекурсии не будет. Если новое значение равно старому, ничего не происходит.


Название: Re: Связывание скроллируемых списков
Отправлено: GreatSnake от Апрель 23, 2010, 11:20
Цитировать
Рекурсии не будет. Если новое значение равно старому, ничего не происходит.
Да, действительно так. Чего-то я зря перестраховался.


Название: Re: Связывание скроллируемых списков
Отправлено: SABROG от Апрель 23, 2010, 14:18
Вроде даже работает.

Код
C++ (Qt)
   QScrollBar* vScroll1 = ui->listWidget->verticalScrollBar();
   QScrollBar* hScroll1 = ui->listWidget->horizontalScrollBar();
   QScrollBar* vScroll2 = ui->listWidget_2->verticalScrollBar();
   QScrollBar* hScroll2 = ui->listWidget_2->horizontalScrollBar();
   QObject::connect(vScroll1, SIGNAL(valueChanged(int)), vScroll2, SLOT(setValue(int)));
   QObject::connect(hScroll1, SIGNAL(valueChanged(int)), hScroll2, SLOT(setValue(int)));


Название: Re: Связывание скроллируемых списков
Отправлено: Kolobok от Апрель 23, 2010, 14:42
так лучше :)

Код:
QScrollBar* vScroll1 = ui->listWidget->verticalScrollBar();
QScrollBar* hScroll1 = ui->listWidget->horizontalScrollBar();
QScrollBar* vScroll2 = ui->listWidget_2->verticalScrollBar();
QScrollBar* hScroll2 = ui->listWidget_2->horizontalScrollBar();
QObject::connect(vScroll1, SIGNAL(valueChanged(int)), vScroll2, SLOT(setValue(int)));
QObject::connect(hScroll1, SIGNAL(valueChanged(int)), hScroll2, SLOT(setValue(int)));
QObject::connect(vScroll2, SIGNAL(valueChanged(int)), vScroll1, SLOT(setValue(int)));
QObject::connect(hScroll2, SIGNAL(valueChanged(int)), hScroll1, SLOT(setValue(int)));


Название: Re: Связывание скроллируемых списков
Отправлено: SABROG от Апрель 23, 2010, 15:29
Если на одном из виджетов не нужен scrollbar, то можно так сделать:

Код
C++ (Qt)
ui->listWidget_2->setVerticalScrollBar(ui->listWidget->verticalScrollBar());
 


Название: Re: Связывание скроллируемых списков
Отправлено: boruh от Апрель 23, 2010, 22:12
Коллеги!
Огромное спасибо, премного благодарен! Стыдно, но я проморгал сигнал valueChanged(), потому и хлипко все работало. Теперь все как влитое.

Маркирую как РЕШЕНО!