Ich verwende qGraphicsView , um ein Bild zu skalieren/zu bewegen. Ich arbeite in diesem Code, der auf dieser Frage basiert. Es beschränkt das Bild daran .
Mit dieser neuen Klasse versuche ich, das Bild überall auf dem Ansichtsfenster zu verschieben, so lange ein bestimmter Bereich davon (_pixmaprect) ausgeht vollständig Aus den Ansichtsfenstergrenzen. IMG Alt = "Bildschirmaufnahme des laufenden Programms. > im Maßstab 1,22 Ich bin in der Lage, es nur ein wenig um seinen Anfangsbereich zu bewegen, auf größeren Maßstäben, die es überall hinweg bewegen, einschließlich des Verschiebens außerhalb der Ansichtsfenstergrenzen, was ich möchte Um zu vermeiden. .NET /oihozxa4.png " /> < /p>
Dies ist nicht, das Bild ist vollständig draußen: < /p>
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();
}
[/code]
Einschränkender Element aus der QGraphicsView -Szene nach eingeschränktem Rechtek ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post
-
-
Einschränkender Element aus der QGraphicsView -Szene nach eingeschränktem Rechtek
by Anonymous » » in C++ - 0 Replies
- 11 Views
-
Last post by Anonymous
-