当我启用Antialiasing时,为什么在QGraphicsView中看到pixmap图块之间的间隙

时间:2015-08-10 15:16:42

标签: qt qgraphicsview qpixmap

我正在使用QGraphicsView框架来显示较小的QPixmap图块中的大图像。我还想启用抗锯齿,因为场景将包含行项目。当我启用Antialiasing时,为什么会看到切片之间的间隙?

class MainWindow : public QWidget
{
    public:
    MainWindow(QWidget *parent = 0);

protected:
    void resizeEvent(QResizeEvent*);

private:
    QGraphicsScene* _scene;
    QGraphicsView* _view;
    qreal _scale;
    static const int _imageWidth = 512;
    static const int _imageHeight = 128;
};

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
{
    _scene = new QGraphicsScene(this);
    _view = new QGraphicsView(_scene, this);

     //this causes gaps to appear ?
    _view->setRenderHints(QPainter::Antialiasing);

    _scene->setBackgroundBrush( QBrush( QColor( Qt::lightGray ) ) );

    QHBoxLayout *layout = new QHBoxLayout(this);
    layout->addWidget(_view);

    setWindowTitle(QString("GapsBetweenTiles- QT Version %1")
       .arg(QT_VERSION_STR));

    QImage img = QImage(_imageWidth, _imageHeight, QImage::Format_RGB32);
    img.fill(QColor(00, 50, 50));

    int offset = 0;
    for (int k=0; k < 10; ++k) {
        QGraphicsPixmapItem* pixitem = _scene->addPixmap( 
                          QPixmap::fromImage(img));
        pixitem->setTransformationMode(Qt::SmoothTransformation);
        pixitem->setPos(0, offset);
        offset += _imageHeight;
    }
    _scale = 1.0;
}

void MainWindow::resizeEvent(QResizeEvent* )
{
    int scaledWidth = (qreal)_view->width() -
                           _view->verticalScrollBar()->width() ;
    qreal scale = (qreal)scaledWidth / (qreal)_imageWidth;
    qreal scaleMult = scale / _scale;

    _view->scale(scaleMult, scaleMult);
    _scale = scale;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

1 个答案:

答案 0 :(得分:1)

当缩放图像高度(_imageHeight * scale)变为小数时,会出现间隙。 每个QGraphicsPixmapItem都被绘制为一个单独的对象。如果此对象具有小数高度,则在启用消除锯齿时会对边框进行平滑处理(部分绘制部分边界线)。

您的案例中有三种可能的间隙布局:

  • 如果缩放图像高度为整数
  • ,则无间隙
  • 如果高度的分数部分为0.5
  • ,则具有间隙的1个对象的周期序列和没有间隙的1个对象的周期序列
  • 如果小数部分为0.25或0.75,则周期性系列的3个具有间隙的物体和1个没有间隙的物体;这里第二个差距比第一个和第三个差距更明亮。

因此,如果您想要完美的对象对齐,则缩放高度应为整数。 在您的示例中,当缩放宽度可被4整除时,缩放高度为整数。 可以通过在resizeEvent中添加以下行来验证:

    scaledWidth = (scaledWidth / 4) * 4;

顺便说一句,你可以通过删除行来禁用QGraphicsPixmapItem个对象的抗锯齿:

    pixitem->setTransformationMode(Qt::SmoothTransformation);