首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >启用抗锯齿功能时,为什么会在QGraphicsView中看到像素图切片之间的间隙

启用抗锯齿功能时,为什么会在QGraphicsView中看到像素图切片之间的间隙
EN

Stack Overflow用户
提问于 2015-08-10 23:16:42
回答 1查看 214关注 0票数 1

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

代码语言:javascript
运行
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2015-08-11 05:25:52

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

在您的情况下,有三种可能的间隙布局:

如果缩放图像高度是1个有间隙和1个没有间隙的integer

  • periodic系列,则
  • 无间隙;如果高度的小数部分是0.5
  • 3个有间隙的对象和1个没有间隙的对象的周期性系列,如果分数部分是0.25或0.75,则没有间隙;这里,第二个间隙比第一个和第三个间隙更亮。

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

代码语言:javascript
运行
复制
    scaledWidth = (scaledWidth / 4) * 4;

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

代码语言:javascript
运行
复制
    pixitem->setTransformationMode(Qt::SmoothTransformation);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31923269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档