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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Связывание скроллируемых списков  (Прочитано 5560 раз)
boruh
Гость
« : Апрель 23, 2010, 00:48 »

Здравствуйте, коллеги.

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

Я вообщем-то решил задачу, но как-то шатко все получилось - возникают "провалы", отставания, рассинхронизация и т.д. Хотелось бы узнать ваше мнение по данному вопросу: как лучше реализовать такую синхронность.
« Последнее редактирование: Апрель 23, 2010, 22:13 от boruh » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Апрель 23, 2010, 01:27 »

Я бы начал экспериментировать так:
на родительском виджете (на котором расположены оба представления) повесил фильтр событий на оба представления. В обработчике фильтра определял какое из представлений получает QWheelEvent, и насколько нужно прокрутить оба представления.
Саму прокрутку обрамил бы в setUpdateEnabled, чтобы визуальных касечков видно не было
Записан

Юра.
boruh
Гость
« Ответ #2 : Апрель 23, 2010, 01:56 »

Но скроллирование ведь может не только по колесу мыши срабатывать. Может и по нажатию по клавишам на клаве, может и по тасканию ползунка. Хотя все эти события можно так же перехватывать.
Да, еще важный момент, я не совсем правильно описал структуру формы. На форме лежит два QTabWidget, и в каждом из них есть по QListView. Т.е. вьюхи не на самой форме лежат, а в табвиджетах.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Апрель 23, 2010, 08:11 »

lit-uriy
Зачем так усложнять?

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

Вешаете на каждый QScrollBar слот и синхронизируете значение для другого соответствующего scrollbar-a.
Только нужно или блокировать сигналы или вставить гарды, чтобы избежать рекурсии.
« Последнее редактирование: Апрель 23, 2010, 08:14 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Kolobok
Гость
« Ответ #4 : Апрель 23, 2010, 11:11 »

Только нужно или блокировать сигналы или вставить гарды, чтобы избежать рекурсии.

Рекурсии не будет. Если новое значение равно старому, ничего не происходит.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Апрель 23, 2010, 11:20 »

Цитировать
Рекурсии не будет. Если новое значение равно старому, ничего не происходит.
Да, действительно так. Чего-то я зря перестраховался.
Записан

Qt 5.11/4.8.7 (X11/Win)
SABROG
Гость
« Ответ #6 : Апрель 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)));
Записан
Kolobok
Гость
« Ответ #7 : Апрель 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)));
Записан
SABROG
Гость
« Ответ #8 : Апрель 23, 2010, 15:29 »

Если на одном из виджетов не нужен scrollbar, то можно так сделать:

Код
C++ (Qt)
ui->listWidget_2->setVerticalScrollBar(ui->listWidget->verticalScrollBar());
 
Записан
boruh
Гость
« Ответ #9 : Апрель 23, 2010, 22:12 »

Коллеги!
Огромное спасибо, премного благодарен! Стыдно, но я проморгал сигнал valueChanged(), потому и хлипко все работало. Теперь все как влитое.

Маркирую как РЕШЕНО!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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