Я использую qgraphicsview , чтобы иметь возможность масштабировать/перемещаться по изображению, я работаю в этом коде, который основан на этом вопросе, он ограничивает изображение от перемещения за пределы границ .
С этим новым классом я стараюсь перемещать изображение в любом месте в виде просмотра, так как такая конкретная область (_pixmaprect) не выходит целый Out the Viewport Bounds. < /p>
в коде ниже, в зависимости от уровня масштаба, я не могу переместить изображение вокруг: < /p>
https : //i.imgur.com/tisbtdu.gif
в масштабе 1,22 я могу перемещать ее только вокруг его начальной области, на больших масштабах im Способен переместить его повсюду, включая его полное перемещение за пределами границ просмотра, чего я хотел бы избежать. < /p>
/p>
#include
class GraphicsView : public QGraphicsView
{
public:
QLabel* _posLabel = nullptr;
QGraphicsScene* _scene = nullptr;
QGraphicsPixmapItem* _pixmapItem = nullptr;
bool _isPanning = false;
qreal _currentScale = 1.0;
QPoint _lastMousePos;
QRect _pixmapRect;
GraphicsView(QWidget* p = nullptr) : QGraphicsView(p)
{
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setRenderHint(QPainter::SmoothPixmapTransform);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
setFrameShape(QFrame::NoFrame);
setTransformationAnchor(QGraphicsView::NoAnchor);
setResizeAnchor(QGraphicsView::NoAnchor);
setBackgroundBrush(QBrush(QColor(0, 0, 0, 80 * 2.55)));
setAlignment(Qt::AlignCenter);
setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing);
setMouseTracking(true);
setFixedSize(960, 540);
_posLabel = new QLabel(this);
_posLabel->setFixedSize(300, 50);
_posLabel->setStyleSheet("QLabel { font-size: 18px; color : white; }");
_posLabel->move(0, 0);
_posLabel->setText("0,0 0x0\nscale: 0");
QList sbList{ new QSpinBox(this), new QSpinBox(this) };
for (int i = 0; i < 2; i++)
{
QSpinBox* sb = sbList;
sb->setRange(1, i ? 540 : 960);
sb->move( i ? 900 : 860, 0);
sb->setValue( i ? 50 : 50);
sb->setSingleStep(40);
sb->setFixedWidth(60);
connect(sb, &QSpinBox::valueChanged, [=](int value)
{
QPixmap pixmap(size());
pixmap.fill(Qt::transparent);
QRect r(420, 250, sbList[0]->value(), sbList[1]->value());
QPainter(&pixmap).fillRect(r, Qt::red);
_pixmapRect = r;
_pixmapItem->setPixmap(pixmap);
});
}
_pixmapItem = new QGraphicsPixmapItem();
_scene = new QGraphicsScene(this);
_scene->addItem(_pixmapItem);
setScene(_scene);
};
void centerScene()
{
// First check if the top left corner is in the middle of the view.
QPointF topLeft = mapFromScene(0, 0);
if (topLeft.x() > 0 || topLeft.y() > 0)
{
QTransform t;
t.translate(
topLeft.x() > 0 ? -topLeft.x() / _currentScale : 0,
topLeft.y() > 0 ? -topLeft.y() / _currentScale : 0
);
setTransform(t, true);
}
else
{
// If not, then check if perhaps the bottom right corner is.
QPointF bottomRight = mapFromScene(width(), height());
if (bottomRight.x() < width() || bottomRight.y() < height())
{
QTransform t;
t.translate(
bottomRight.x() < width() ? - (bottomRight.x() - width()) / _currentScale : 0,
bottomRight.y() < height() ? -(bottomRight.y() - height()) / _currentScale : 0
);
setTransform(t, true);
}
}
QRect pixmapRect = viewportTransform().mapRect(_pixmapRect);
_posLabel->setText(QString("%1,%2 %3x%4\nscale: %5")
.arg(pixmapRect.x()).arg(pixmapRect.y()).arg(pixmapRect.width()).arg(pixmapRect.height())
.arg(QString::number(_currentScale, 'f', 2)));
}
void mouseMoveEvent(QMouseEvent* event) override
{
if (!_isPanning)
return;
QPointF delta = mapToScene(event->pos()) - mapToScene(_lastMousePos);
QTransform t;
t.translate(delta.x(), delta.y());
setTransform(t, true);
centerScene();
_lastMousePos = event->pos();
event->accept();
}
void mousePressEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
_isPanning = true;
_lastMousePos = event->pos();
setCursor(Qt::ClosedHandCursor);
event->accept();
}
}
void mouseReleaseEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
_isPanning = false;
setCursor(Qt::ArrowCursor);
event->accept();
}
}
void wheelEvent(QWheelEvent* event) override
{
// Store cursor position relative to scene
QPointF mousePos = event->position(),
mousePosCurrent = mapToScene(mousePos.x(), mousePos.y());
// Calculate zoom factor
double factor = pow(1.5, event->angleDelta().y() / 240.0);
double newScale = _currentScale * factor;
if (newScale < 1.) { // Do not allow zooming out (in absolute)
factor /= newScale;
newScale = 1.;
}
else if (newScale > 50.) { // Do not allow zoom > 50x
factor = factor * 50. / newScale;
newScale = 50.;
}
// Zoom centered on the mouse cursor
QTransform t;
t.translate(mousePosCurrent.x(), mousePosCurrent.y());
t.scale(factor, factor);
t.translate(-mousePosCurrent.x(), -mousePosCurrent.y());
setTransform(t, true);
_currentScale = newScale;
centerScene();
event->accept();
}
};
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
GraphicsView view;
view.show();
emit view.findChild()->valueChanged(0);
return a.exec();
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... strained-r
Ограничение предмета от перемещения на сцене QGraphicsView в соответствии с ограниченным прямоугольным ⇐ C++
Программы на C++. Форум разработчиков
1739317505
Anonymous
Я использую [b] qgraphicsview [/b], чтобы иметь возможность масштабировать/перемещаться по изображению, я работаю в этом коде, который основан на этом вопросе, он ограничивает изображение от перемещения за пределы границ .
С этим новым классом я стараюсь перемещать изображение в любом месте в виде просмотра, так как такая конкретная область (_pixmaprect) не выходит [b] целый Out the Viewport Bounds. < /p>
в коде ниже, в зависимости от уровня масштаба, я не могу переместить изображение вокруг: < /p>
https : //i.imgur.com/tisbtdu.gif
в масштабе 1,22 [/b] я могу перемещать ее только вокруг его начальной области, на больших масштабах im Способен переместить его повсюду, включая его полное перемещение за пределами границ просмотра, чего я хотел бы избежать. < /p>
/p>
#include
class GraphicsView : public QGraphicsView
{
public:
QLabel* _posLabel = nullptr;
QGraphicsScene* _scene = nullptr;
QGraphicsPixmapItem* _pixmapItem = nullptr;
bool _isPanning = false;
qreal _currentScale = 1.0;
QPoint _lastMousePos;
QRect _pixmapRect;
GraphicsView(QWidget* p = nullptr) : QGraphicsView(p)
{
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setRenderHint(QPainter::SmoothPixmapTransform);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
setFrameShape(QFrame::NoFrame);
setTransformationAnchor(QGraphicsView::NoAnchor);
setResizeAnchor(QGraphicsView::NoAnchor);
setBackgroundBrush(QBrush(QColor(0, 0, 0, 80 * 2.55)));
setAlignment(Qt::AlignCenter);
setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing);
setMouseTracking(true);
setFixedSize(960, 540);
_posLabel = new QLabel(this);
_posLabel->setFixedSize(300, 50);
_posLabel->setStyleSheet("QLabel { font-size: 18px; color : white; }");
_posLabel->move(0, 0);
_posLabel->setText("0,0 0x0\nscale: 0");
QList sbList{ new QSpinBox(this), new QSpinBox(this) };
for (int i = 0; i < 2; i++)
{
QSpinBox* sb = sbList[i];
sb->setRange(1, i ? 540 : 960);
sb->move( i ? 900 : 860, 0);
sb->setValue( i ? 50 : 50);
sb->setSingleStep(40);
sb->setFixedWidth(60);
connect(sb, &QSpinBox::valueChanged, [=](int value)
{
QPixmap pixmap(size());
pixmap.fill(Qt::transparent);
QRect r(420, 250, sbList[0]->value(), sbList[1]->value());
QPainter(&pixmap).fillRect(r, Qt::red);
_pixmapRect = r;
_pixmapItem->setPixmap(pixmap);
});
}
_pixmapItem = new QGraphicsPixmapItem();
_scene = new QGraphicsScene(this);
_scene->addItem(_pixmapItem);
setScene(_scene);
};
void centerScene()
{
// First check if the top left corner is in the middle of the view.
QPointF topLeft = mapFromScene(0, 0);
if (topLeft.x() > 0 || topLeft.y() > 0)
{
QTransform t;
t.translate(
topLeft.x() > 0 ? -topLeft.x() / _currentScale : 0,
topLeft.y() > 0 ? -topLeft.y() / _currentScale : 0
);
setTransform(t, true);
}
else
{
// If not, then check if perhaps the bottom right corner is.
QPointF bottomRight = mapFromScene(width(), height());
if (bottomRight.x() < width() || bottomRight.y() < height())
{
QTransform t;
t.translate(
bottomRight.x() < width() ? - (bottomRight.x() - width()) / _currentScale : 0,
bottomRight.y() < height() ? -(bottomRight.y() - height()) / _currentScale : 0
);
setTransform(t, true);
}
}
QRect pixmapRect = viewportTransform().mapRect(_pixmapRect);
_posLabel->setText(QString("%1,%2 %3x%4\nscale: %5")
.arg(pixmapRect.x()).arg(pixmapRect.y()).arg(pixmapRect.width()).arg(pixmapRect.height())
.arg(QString::number(_currentScale, 'f', 2)));
}
void mouseMoveEvent(QMouseEvent* event) override
{
if (!_isPanning)
return;
QPointF delta = mapToScene(event->pos()) - mapToScene(_lastMousePos);
QTransform t;
t.translate(delta.x(), delta.y());
setTransform(t, true);
centerScene();
_lastMousePos = event->pos();
event->accept();
}
void mousePressEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
_isPanning = true;
_lastMousePos = event->pos();
setCursor(Qt::ClosedHandCursor);
event->accept();
}
}
void mouseReleaseEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
_isPanning = false;
setCursor(Qt::ArrowCursor);
event->accept();
}
}
void wheelEvent(QWheelEvent* event) override
{
// Store cursor position relative to scene
QPointF mousePos = event->position(),
mousePosCurrent = mapToScene(mousePos.x(), mousePos.y());
// Calculate zoom factor
double factor = pow(1.5, event->angleDelta().y() / 240.0);
double newScale = _currentScale * factor;
if (newScale < 1.) { // Do not allow zooming out (in absolute)
factor /= newScale;
newScale = 1.;
}
else if (newScale > 50.) { // Do not allow zoom > 50x
factor = factor * 50. / newScale;
newScale = 50.;
}
// Zoom centered on the mouse cursor
QTransform t;
t.translate(mousePosCurrent.x(), mousePosCurrent.y());
t.scale(factor, factor);
t.translate(-mousePosCurrent.x(), -mousePosCurrent.y());
setTransform(t, true);
_currentScale = newScale;
centerScene();
event->accept();
}
};
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
GraphicsView view;
view.show();
emit view.findChild()->valueChanged(0);
return a.exec();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79431571/limiting-item-from-being-moved-on-qgraphicsview-scene-according-to-constrained-r[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия