8

QGraphicsViewを再実装して、マウス ホイール イベントでシーンをズームしました。シーンにはいくつかのQGraphicsPixmapItemが含まれています。wheel イベントはQGraphicsView::scale(qreal sx, qreal sy) を呼び出します

レンダリング以外はすべて完璧に機能します。ズームアウトすると (シーンが小さくなります)、エイリアシングが表示されます。再実装されたQGraphicsViewコンストラクターで、レンダーヒントを次のように設定してみました。

ImageViewer::ImageViewer(QWidget * parent) :
  QGraphicsView(parent)
{
   setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing);
}

私はまだこれらのアーティファクトを見ています。どうすればこれを取り除くことができますか?

4

2 に答える 2

8

この質問に対する私のコメントをご覧ください。

基本的に、アンチエイリアスを適用したい を呼び出す必要がありsetTransformationMode(Qt::SmoothTransformation)ますQGraphicsPixmapItem

ビューの呼び出しsetRenderHintsもうまくいきませんでした。

于 2013-08-18T20:39:30.190 に答える
0

レンダー ヒントは、ペインターが使用される前に設定されている場合にのみ適用されます。ここで切り取った:

QGraphicsPixmapItem *
drawGraphicsPixmapItem(const QRectF &rect)
{
    auto pixmap = new QPixmap(rect.size().toSize());
    pixmap->fill("lightGrey");

    auto painter = new QPainter(pixmap);
    // set render hints bevor drawing with painter
    painter->setRenderHints(QPainter::Antialiasing);

    QPen pen;
    pen.setColor("black");
    pen.setWidth(3);
    painter->setPen(pen);
    QRectF rectT = rect;
    rectT.adjust(pen.widthF()/2,pen.widthF()/2,-pen.widthF()/2,-pen.widthF()/2);

    QPainterPath circlePath;
    circlePath.addEllipse(rectT);
    circlePath.closeSubpath();
    painter->fillPath(circlePath,QBrush("green"));
    painter->drawPath(circlePath);
    auto pixmapItem = new QGraphicsPixmapItem(*pixmap);
    pixmapItem->setCacheMode(
             QGraphicsItem::CacheMode::DeviceCoordinateCache,
             pixmap->size() );
    return pixmapItem;
}
于 2018-07-16T11:54:37.350 に答える