Russian Qt Forum

Qt => Общие вопросы => Тема начата: gil9red от Август 17, 2013, 02:09



Название: Модификация Image Viewer
Отправлено: gil9red от Август 17, 2013, 02:09
Всем привет :)
Как в том примере Qt, перемещать мышкой label с изображением, если изображение больше окна (т.е. появились скроллы)? :)
Т.е. зажимаем кнопку мыши и тащим label по scrollarea :)


Название: Re: Модификация Image Viewer
Отправлено: neversleep от Август 17, 2013, 14:13
Не уверен, что правильно понял вопрос :) Если нужно просто двигать содержимое QScrollArea зажатой кнопкой мыши, то отлавливаешь события QEvent::MouseButtonPress и QEvent::MouseMove у QScrollArea и двигаешь скроллбары.


Название: Re: Модификация Image Viewer
Отправлено: gil9red от Август 17, 2013, 15:18
Не уверен, что правильно понял вопрос :) Если нужно просто двигать содержимое QScrollArea зажатой кнопкой мыши, то отлавливаешь события QEvent::MouseButtonPress и QEvent::MouseMove у QScrollArea и двигаешь скроллбары.
да-да-да! :)
И это правильная догадка! ))
А вот как двигать я фз :)
Смотреть смешение мышки (delta) и прибавлять это смешение к позиции скроллбаров? )


Название: Re: Модификация Image Viewer
Отправлено: neversleep от Август 17, 2013, 15:28
На форме: QScrollArea(layout vertically) и на ней QLabel.

Код
C++ (Qt)
QPoint pt;
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   ui->scrollArea->installEventFilter(this);
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
   if (obj == ui->scrollArea) {
       QMouseEvent *me;
       QScrollBar *sb;
 
       switch (e->type()) {
       case QEvent::MouseButtonPress:
           me = static_cast<QMouseEvent*>(e);
           if (me->button() == Qt::LeftButton) {
               pt = me->localPos().toPoint();
               ui->scrollArea->setCursor(Qt::ClosedHandCursor);
           }
           break;
 
       case QEvent::MouseMove:
           me = static_cast<QMouseEvent*>(e);
           if (me->buttons() & Qt::LeftButton) {
               pt -= me->localPos().toPoint();
 
               sb = ui->scrollArea->horizontalScrollBar();
               sb->setValue(pt.x() + sb->value());
 
               sb = ui->scrollArea->verticalScrollBar();
               sb->setValue(pt.y() + sb->value());
 
               pt = me->localPos().toPoint();
           }
           break;
 
       case QEvent::MouseButtonRelease:
           ui->scrollArea->setCursor(Qt::ArrowCursor);
           break;
 
       default:
           break;
       }
   }
   return QMainWindow::eventFilter(obj, e);
}


Название: Re: Модификация Image Viewer
Отправлено: gil9red от Август 17, 2013, 19:25
Ясно :)
Мне казалось, что это более муторно будет выглядеть :)
Значит, почти также как я описал :D


Название: Re: Модификация Image Viewer
Отправлено: gil9red от Август 17, 2013, 20:26
Интересно, в какой версии был localPos().toPoint() :)
У меня 4.8 и такого у qmouseevent нет )

Немного измененный код:
Код:
...
private:
     QPoint lastPos;
...
bool UImageViewer::eventFilter(QObject *object, QEvent *event)
{
    if(object == scrollArea)
    {
        if(event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *mouseEvent = static_cast <QMouseEvent *> (event);
            if(mouseEvent->button() == Qt::LeftButton)
            {
                lastPos = mouseEvent->pos();
                scrollArea->setCursor(Qt::ClosedHandCursor);
            }

        }else if(event->type() == QEvent::MouseMove)
        {
            QMouseEvent *mouseEvent = static_cast <QMouseEvent *> (event);

            if(mouseEvent->buttons() == Qt::LeftButton)
            {
                lastPos -= mouseEvent->pos();

                int hValue = scrollArea->horizontalScrollBar()->value();
                int vValue = scrollArea->verticalScrollBar()->value();

                scrollArea->horizontalScrollBar()->setValue(lastPos.x() + hValue);
                scrollArea->verticalScrollBar()->setValue(lastPos.y() + vValue);

                lastPos = mouseEvent->pos();
            }

        }else if(event->type() == QEvent::MouseButtonRelease)
            scrollArea->setCursor(Qt::ArrowCursor);
    }

    return QMainWindow::eventFilter(object, event);
}


Название: Re: Модификация Image Viewer
Отправлено: neversleep от Август 17, 2013, 21:28
Интересно, в какой версии был localPos().toPoint() :)
У меня 4.8 и такого у qmouseevent нет )
5.1.0 (Linux)