qtqgraphicsviewqgraphicsscene

Lines thickness changes spontaneously when scaling QGraphicsView


I am drawing lines in Qt using Graphics View framework. Since i want my picture to take the same portion of space when the window is resized, I override MainWindow::resizeEvent, so that graphics view is rescaled according to the resize event:

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);
    }
}

However, doing so, my lines (that should have thickness of 1 pixel) sometimes have different thickness after resize. As I understand, it happens because coordinates of the objects after transforming to the GraphicsView are real, so are sometimes drawn with different number of pixels. That is unacceptable! I want lines to have same 1-pixel thickness all the time.

So, my question is: what is the usual solution for this problem? For now (based on my assumption above) I can only think of deleting all objects and creating new with integer coordinates, but rescaled (manually).


Solution

  • You need to set your line drawing to "cosmetic" in the QPen. This makes the lines non-scalable. Otherwise, Qt scales the line widths along with the scaling of the view. Look up QPen::setCosmetic. By default, drawing lines is not cosmetic.