Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vux от Июль 29, 2010, 09:39



Название: Тянуть виджэт мышой
Отправлено: vux от Июль 29, 2010, 09:39
есть виджэт внутри scrollarea но я хочу чтобы можно было таскать его вертикально нетолько за ползунок скрола но и внутри самого виджэта. То есть в свободном месте виджэта (где нет других элементов) нажимаю кнопку мыши тяну и опускаю.
Как это правильно реализовать?


Название: Re: Тянуть виджэт мышой
Отправлено: lit-uriy от Июль 29, 2010, 11:45
ловить события мыши и в зависимости от перемещения мыши смещать область прокрутки (QScrollArea)
* Можно поставить фильтр событий на область прокрутки в родительском виджете
* можно сделать наследника от этой области прокрутки, и там обрабатывать события мыши.


Название: Re: Тянуть виджэт мышой
Отправлено: vux от Июль 29, 2010, 12:30
Немного не доганяю. У виджэта который внутри ScrollArea я должэн менять mouseMoveEvent.
Но как его связать с перемещением ScrollArea не доганяю.
Если с помощью ScrollBar то не понятно как позицыю мыши связать с например ScrollBar.setPosition(int)
направте


Название: Re: Тянуть виджэт мышой
Отправлено: Kolobok от Июль 29, 2010, 13:08
Возьми QGraphicsView.


Название: Re: Тянуть виджэт мышой
Отправлено: lit-uriy от Июль 29, 2010, 13:10
>>У виджэта который внутри ScrollArea я должэн менять mouseMoveEvent.
Хм, может я не понял:
>>То есть в свободном месте виджэта
здесь имелось в виду не свободное место на ScrollArea?


Название: Re: Тянуть виджэт мышой
Отправлено: vux от Июль 29, 2010, 13:17
Возьми QGraphicsView.

неподходит


Название: Re: Тянуть виджэт мышой
Отправлено: Kolobok от Июль 29, 2010, 13:21
Возьми QGraphicsView.

неподходит

Почему?


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

SrollBar.setPosition устанавливает позицию слайдера в сваих единицах, а как их связать с координатами мыши внутри виджэта - непонятно


Название: Re: Тянуть виджэт мышой
Отправлено: vux от Июль 29, 2010, 13:38

потому что это левая Qtшная програма со своими сложными элементами. Я туда вклиниваюсь с помощью PyQt и просто должэн подправить ужэ готовый сложный виджэт - в моем случае это просто установка своих filterEvent.
То есть понятно что перелопачивать все это и связывать с QGraphicsView мне неохота - да и нелогично это тк моя задача судя повсему решается просто - нада токо чтобы направили


Название: Re: Тянуть виджэт мышой
Отправлено: vux от Июль 29, 2010, 14:08
Мне в голову приходит такое:
1. в mousePressEvent я запоминаю координаты мыши в виджете
2. в mouseMoveEvent узнаю разницу между текущим положением и запомненым ранее.

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

какбы все просто но как переместить контент на N-ое количество пикселей я не понимаю или просто ненашэл в доках


Название: Re: Тянуть виджэт мышой
Отправлено: Kolobok от Июль 29, 2010, 14:42
Код:
QScrollArea::horizontalScrollBar()->setValue( int )
QScrollArea::verticalScrollBar()->setValue( int )


Название: Re: Тянуть виджэт мышой
Отправлено: vux от Июль 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_()


Название: Re: Тянуть виджэт мышой
Отправлено: Blayder от Июль 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());
    }

Такой код в итоге. Сам я не спец в этом и делал с помощью гугля  иметода тыка :)


Название: Re: Тянуть виджэт мышой
Отправлено: lit-uriy от Июль 29, 2010, 15:38
vux, ты устанавливаешь скролу жёсткое значение, а его нужно смещать, как у Blayder. Т.е. вычитать смещение мыши из текущего значения скрола


Название: Re: Тянуть виджэт мышой
Отправлено: vux от Июль 29, 2010, 15:47
Все работает :D Всем большое спасиба!