缩放 QGraphicsView 时线条粗细会自发变化
Lines thickness changes spontaneously when scaling QGraphicsView
我正在使用图形视图框架在 Qt 中绘制线条。因为我希望在 window 调整大小时我的图片占据 space 的相同部分,所以我覆盖 MainWindow::resizeEvent,以便根据调整大小事件重新缩放图形视图:
void MainWindow::resizeEvent(QResizeEvent *event) {
int w = event->size().width(), h = event->size().height();
int prev_w = event->oldSize().width(), prev_h = event->oldSize().height();
if (prev_w != -1) {
int s1 = std::min(prev_w, prev_h), s2 = std::min(w, h);
qreal k = (qreal)s2 / s1;
std::cerr << k << std::endl;
ui->graphicsView->scale(k, k);
}
}
但是,这样做后,我的线条(应该有 1 个像素的粗细)在调整大小后有时会有不同的粗细。据我了解,发生这种情况是因为转换为 GraphicsView 后对象的坐标是真实的,因此有时会用不同数量的像素绘制。这是不可接受的!我希望线条始终具有相同的 1 像素粗细。
所以,我的问题是:这个问题的通常解决方案是什么?现在(基于我上面的假设)我只能考虑删除所有对象并使用整数坐标创建新对象,但重新缩放(手动)。
您需要在QPen中将画线设置为"cosmetic"。这使得行 non-scalable。否则,Qt 会随着视图的缩放而缩放线宽。查找 QPen::setCosmetic。默认情况下,绘制线条不是装饰性的。
我正在使用图形视图框架在 Qt 中绘制线条。因为我希望在 window 调整大小时我的图片占据 space 的相同部分,所以我覆盖 MainWindow::resizeEvent,以便根据调整大小事件重新缩放图形视图:
void MainWindow::resizeEvent(QResizeEvent *event) {
int w = event->size().width(), h = event->size().height();
int prev_w = event->oldSize().width(), prev_h = event->oldSize().height();
if (prev_w != -1) {
int s1 = std::min(prev_w, prev_h), s2 = std::min(w, h);
qreal k = (qreal)s2 / s1;
std::cerr << k << std::endl;
ui->graphicsView->scale(k, k);
}
}
但是,这样做后,我的线条(应该有 1 个像素的粗细)在调整大小后有时会有不同的粗细。据我了解,发生这种情况是因为转换为 GraphicsView 后对象的坐标是真实的,因此有时会用不同数量的像素绘制。这是不可接受的!我希望线条始终具有相同的 1 像素粗细。
所以,我的问题是:这个问题的通常解决方案是什么?现在(基于我上面的假设)我只能考虑删除所有对象并使用整数坐标创建新对象,但重新缩放(手动)。
您需要在QPen中将画线设置为"cosmetic"。这使得行 non-scalable。否则,Qt 会随着视图的缩放而缩放线宽。查找 QPen::setCosmetic。默认情况下,绘制线条不是装饰性的。