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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Модификация Image Viewer  (Прочитано 3603 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Август 17, 2013, 02:09 »

Всем привет Улыбающийся
Как в том примере Qt, перемещать мышкой label с изображением, если изображение больше окна (т.е. появились скроллы)? Улыбающийся
Т.е. зажимаем кнопку мыши и тащим label по scrollarea Улыбающийся
« Последнее редактирование: Август 17, 2013, 02:52 от gil9red » Записан

neversleep
Гость
« Ответ #1 : Август 17, 2013, 14:13 »

Не уверен, что правильно понял вопрос Улыбающийся Если нужно просто двигать содержимое QScrollArea зажатой кнопкой мыши, то отлавливаешь события QEvent::MouseButtonPress и QEvent::MouseMove у QScrollArea и двигаешь скроллбары.
« Последнее редактирование: Август 17, 2013, 14:15 от neversleep » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Август 17, 2013, 15:18 »

Не уверен, что правильно понял вопрос Улыбающийся Если нужно просто двигать содержимое QScrollArea зажатой кнопкой мыши, то отлавливаешь события QEvent::MouseButtonPress и QEvent::MouseMove у QScrollArea и двигаешь скроллбары.
да-да-да! Улыбающийся
И это правильная догадка! ))
А вот как двигать я фз Улыбающийся
Смотреть смешение мышки (delta) и прибавлять это смешение к позиции скроллбаров? )
Записан

neversleep
Гость
« Ответ #3 : Август 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);
}
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Август 17, 2013, 19:25 »

Ясно Улыбающийся
Мне казалось, что это более муторно будет выглядеть Улыбающийся
Значит, почти также как я описал Веселый
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Август 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);
}
Записан

neversleep
Гость
« Ответ #6 : Август 17, 2013, 21:28 »

Интересно, в какой версии был localPos().toPoint() Улыбающийся
У меня 4.8 и такого у qmouseevent нет )
5.1.0 (Linux)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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