当我在 Qt 上调整图像大小时,如何将焦点放在小部件的中间点?
When I resize an image on Qt, how can I focus to middle point of widget?
我可以使用滑块更改图像的分辨率。我使用 QGraphicsScene
来显示 image.But 问题是当我调整图像大小时,我无法聚焦到 point.You 可以在此处查看我的代码。
这是第一部分,因此它用于调整 image.It 的大小。
void MainWindow::on_sld_scale_valueChanged(int value) {
//for resize an image with slider
int w = m_image->width();
int h = m_image->height();
int new_w = (w * value)/100;
int new_h = (h * value)/100;
m_pixmap = QPixmap::fromImage(
m_image->scaled(new_w, new_h, Qt::KeepAspectRatio, Qt::FastTransformation));
我的 function.It 的第二部分是我的焦点到小部件中间点的算法,但它不起作用。
//for focus to middle point of widget
auto views = m_scene->views();
Q_ASSERT(views.size() == 1);
auto view = views.first();
int pos_x = view->horizontalScrollBar()->value();
int pos_y = view->verticalScrollBar()->value();
show_pixmap();
qDebug() << "x" << pos_x << "w" << view->width()
<< "sbw" << view->verticalScrollBar()->width()
<< "y" << pos_y << "h" << view->height()
<< "sbh" << view->horizontalScrollBar()->height();
int a = pos_x + (view->width()) + (view->verticalScrollBar()->width());
int b = pos_x + (view->height()) + (view->horizontalScrollBar()->height());
a = a * (value/100.0);
b = b * (value/100.0);
m_pixmap = QPixmap::fromImage(*m_image);
view->horizontalScrollBar()->setValue(a);
view->verticalScrollBar()->setValue(b);
}
这是我的来源code.I可以调整图像大小但我无法将焦点放在中间point.Can你能帮我解决这个问题吗?
不要重新创建像素图,使用QGraphicsView
的方法setResizeAnchor()
和scale()
- 你不把
QScrollBar::width
和 QScrollBar::maximum
混在一起吗?他们关系不好
最好不要触摸视图的滚动条。试试 QGraphicsView::centerOn
甚至 QGraphicsView::fitInView
(你是说 "focus" 是 "place to center of the view" 吗?)。像这样:
const qreal centerX = pixmapItem->x() + pixmapItem->width() / 2;
const qreal centerY = pixmapItem->y() + pixmapItem->height() / 2;
viewer->centerOn(centerX , centerY);
其中 pixmapItem
是一个 QGraphicsPixmapItem。
- 如@mvidelgauz 所料,为什么不在场景中缩放 QGraphicsPixmapItem?这可能是重新缩放它的更好解决方案吗?
我可以使用滑块更改图像的分辨率。我使用 QGraphicsScene
来显示 image.But 问题是当我调整图像大小时,我无法聚焦到 point.You 可以在此处查看我的代码。
这是第一部分,因此它用于调整 image.It 的大小。
void MainWindow::on_sld_scale_valueChanged(int value) {
//for resize an image with slider
int w = m_image->width();
int h = m_image->height();
int new_w = (w * value)/100;
int new_h = (h * value)/100;
m_pixmap = QPixmap::fromImage(
m_image->scaled(new_w, new_h, Qt::KeepAspectRatio, Qt::FastTransformation));
我的 function.It 的第二部分是我的焦点到小部件中间点的算法,但它不起作用。
//for focus to middle point of widget
auto views = m_scene->views();
Q_ASSERT(views.size() == 1);
auto view = views.first();
int pos_x = view->horizontalScrollBar()->value();
int pos_y = view->verticalScrollBar()->value();
show_pixmap();
qDebug() << "x" << pos_x << "w" << view->width()
<< "sbw" << view->verticalScrollBar()->width()
<< "y" << pos_y << "h" << view->height()
<< "sbh" << view->horizontalScrollBar()->height();
int a = pos_x + (view->width()) + (view->verticalScrollBar()->width());
int b = pos_x + (view->height()) + (view->horizontalScrollBar()->height());
a = a * (value/100.0);
b = b * (value/100.0);
m_pixmap = QPixmap::fromImage(*m_image);
view->horizontalScrollBar()->setValue(a);
view->verticalScrollBar()->setValue(b);
}
这是我的来源code.I可以调整图像大小但我无法将焦点放在中间point.Can你能帮我解决这个问题吗?
不要重新创建像素图,使用QGraphicsView
的方法setResizeAnchor()
和scale()
- 你不把
QScrollBar::width
和QScrollBar::maximum
混在一起吗?他们关系不好 最好不要触摸视图的滚动条。试试
QGraphicsView::centerOn
甚至QGraphicsView::fitInView
(你是说 "focus" 是 "place to center of the view" 吗?)。像这样:const qreal centerX = pixmapItem->x() + pixmapItem->width() / 2; const qreal centerY = pixmapItem->y() + pixmapItem->height() / 2; viewer->centerOn(centerX , centerY);
其中
pixmapItem
是一个 QGraphicsPixmapItem。- 如@mvidelgauz 所料,为什么不在场景中缩放 QGraphicsPixmapItem?这可能是重新缩放它的更好解决方案吗?