Название: Модификация 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)
|