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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Тянуть виджэт мышой  (Прочитано 7258 раз)
vux
Гость
« : Июль 29, 2010, 09:39 »

есть виджэт внутри scrollarea но я хочу чтобы можно было таскать его вертикально нетолько за ползунок скрола но и внутри самого виджэта. То есть в свободном месте виджэта (где нет других элементов) нажимаю кнопку мыши тяну и опускаю.
Как это правильно реализовать?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июль 29, 2010, 11:45 »

ловить события мыши и в зависимости от перемещения мыши смещать область прокрутки (QScrollArea)
* Можно поставить фильтр событий на область прокрутки в родительском виджете
* можно сделать наследника от этой области прокрутки, и там обрабатывать события мыши.
Записан

Юра.
vux
Гость
« Ответ #2 : Июль 29, 2010, 12:30 »

Немного не доганяю. У виджэта который внутри ScrollArea я должэн менять mouseMoveEvent.
Но как его связать с перемещением ScrollArea не доганяю.
Если с помощью ScrollBar то не понятно как позицыю мыши связать с например ScrollBar.setPosition(int)
направте
Записан
Kolobok
Гость
« Ответ #3 : Июль 29, 2010, 13:08 »

Возьми QGraphicsView.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Июль 29, 2010, 13:10 »

>>У виджэта который внутри ScrollArea я должэн менять mouseMoveEvent.
Хм, может я не понял:
>>То есть в свободном месте виджэта
здесь имелось в виду не свободное место на ScrollArea?
Записан

Юра.
vux
Гость
« Ответ #5 : Июль 29, 2010, 13:17 »

Возьми QGraphicsView.

неподходит
Записан
Kolobok
Гость
« Ответ #6 : Июль 29, 2010, 13:21 »

Возьми QGraphicsView.

неподходит

Почему?
Записан
vux
Гость
« Ответ #7 : Июль 29, 2010, 13:34 »

Обясню по другому Улыбающийся
есть виджэт в котором много других элементов. Но также там есть немного свободного места.
этот виджэт помещен в скроларею. Можно тягать за скроллареу, а можно и за свободное место внутри виджэта.
Тоесть перемещение нажатой мыши должно влиять на перемещение скролбара. У меня получается через SrollBar.setPosition
но перемещается оно тупо. Чтобы показать наглядно что мне нужно возьмем пример с вертикальным перемещением.
Берем любое Qtшное окно с вертикальным скроллбаром. Хватаем его (скроллбар) и неотпуская отодвгаем мышь влево.
Двигаем вверх/вниз - вроде мышь над виджетом но красиво двигает скроллбар - вот так мне нада

SrollBar.setPosition устанавливает позицию слайдера в сваих единицах, а как их связать с координатами мыши внутри виджэта - непонятно
Записан
vux
Гость
« Ответ #8 : Июль 29, 2010, 13:38 »


потому что это левая Qtшная програма со своими сложными элементами. Я туда вклиниваюсь с помощью PyQt и просто должэн подправить ужэ готовый сложный виджэт - в моем случае это просто установка своих filterEvent.
То есть понятно что перелопачивать все это и связывать с QGraphicsView мне неохота - да и нелогично это тк моя задача судя повсему решается просто - нада токо чтобы направили
Записан
vux
Гость
« Ответ #9 : Июль 29, 2010, 14:08 »

Мне в голову приходит такое:
1. в mousePressEvent я запоминаю координаты мыши в виджете
2. в mouseMoveEvent узнаю разницу между текущим положением и запомненым ранее.

Но мне нада какбы не ScrollBar передвинуть програмным путем а контент скролареи в которую он помещен сдвинуть вверх/вниз на ту разницу

какбы все просто но как переместить контент на N-ое количество пикселей я не понимаю или просто ненашэл в доках
Записан
Kolobok
Гость
« Ответ #10 : Июль 29, 2010, 14:42 »

Код:
QScrollArea::horizontalScrollBar()->setValue( int )
QScrollArea::verticalScrollBar()->setValue( int )
Записан
vux
Гость
« Ответ #11 : Июль 29, 2010, 15:02 »

вот мой код
но оно уезжает. Это проще увидеть. мож есть у кого желание - запустите - а то запарился уже. Задача вроде простая...
Код
Python
from PyQt4.QtCore import *
from PyQt4.QtGui import *
 
app=QApplication([])
 
class Widget(QWidget):
def mousePressEvent( self, event ):
self.Y = event.y()
 
def mouseMoveEvent( self, event ):
scroll = self.parent().parent()
vBar = scroll.verticalScrollBar()
vBar.setValue(event.y()-self.Y )
event.accept()
 
wnd = QScrollArea()
w=Widget()
w.resize(800,2600)
b = QPushButton()
wnd.setWidget(w)
wnd.show()
 
app.exec_()
Записан
Blayder
Гость
« Ответ #12 : Июль 29, 2010, 15:03 »

Как раз как-то делал тоже самое задание.
Код:
void mousePressEvent(QMouseEvent *e) {
            mousePos = e->pos();
    }
    void mouseMoveEvent(QMouseEvent *e) {
        QPoint diff = e->pos() - mousePos;
        mousePos = e->pos();
        verticalScrollBar()->setValue(verticalScrollBar()->value() - diff.y());
        horizontalScrollBar()->setValue(horizontalScrollBar()->value() - diff.x());
    }

Такой код в итоге. Сам я не спец в этом и делал с помощью гугля  иметода тыка Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Июль 29, 2010, 15:38 »

vux, ты устанавливаешь скролу жёсткое значение, а его нужно смещать, как у Blayder. Т.е. вычитать смещение мыши из текущего значения скрола
Записан

Юра.
vux
Гость
« Ответ #14 : Июль 29, 2010, 15:47 »

Все работает Веселый Всем большое спасиба!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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