7

drawRoundedRectメソッドを使用して丸い長方形を直接描画しようとしQPixmapます(純粋なQtを除いてレンダリングエンジンはここに含まれません...)、長方形のサイズとピックスマップのサイズを再確認します:

Pixmap : QSize(50, 73) 
Rectangle: QRect(0,0 48x11) 

十分なスペースを参照してください...

編集:いくつかのコード

pixmap = QPixmap(50,73); //example size that match my case
QRectF rect(0,0,48,11);

QPainter painter(&pixmap);
painter.setRenderHint(QPainter::TextAntialiasing);
painter.setWorldMatrixEnabled(false);
painter.setPen(QPen()); //no pen
painter.setBrush(QBrush(color));
painter.drawRoundedRect(rect, 2.0, 2.0);
  • 私は世界の変革を無効にしました...
  • セット変換をユニティに設定しました...
  • いくつかの半径(1.0、2.0、3.0、4.0)を試しました...
  • ペンの幅、ブラシの色を変更します...

しかし、それは常に4つの異なるコーナーを持つ長方形で終わります!そのように:

半径=xおよびyで3.0

ピックスマップをファイルに直接出力して、表示中にスクレイピングされていないことを確認します...同じ形状。

半径の小さいQtの丸い長方形を知っている人はいますか?私はずっと前にそれについて何かを見ました、しかし私はそれをどう扱うかを覚えていません!

4

6 に答える 6

15

アンチエイリアシング(つまり、QPainter::Antialiasingレンダリングヒント)を使用していないようです。これは、それなしで発生するQtの癖です。私が見たり聞いたりしたことから、Qt開発者はこれを修正することにそれほど関心がありません(ほとんどの人はとにかくアンチエイリアシングを望んでいます)。

回避策(アンチエイリアシングを使用する以外に)は、とを使用して自分で四角形を描画することQPainter::drawLine()ですQPainter::drawArc()。正しく見えるまで数値を試してみる必要があるかもしれません。まっすぐな計算では、1〜2ピクセルずれてしまう傾向があります。また、この方法を使用しても、右下の角が他の角とまったく同じになることはありません。

やや野心的な場合は、これを修正してQtにパッチを送信してみてください。

更新:アーク描画の結果はQt 5で変更されました。私の経験では、これは大きな改善です。

于 2011-06-28T14:53:57.183 に答える
4

私はこれが古い問題であることを知っていますが、Qt5ユーザーにとっては問題を解決しているようですsetRenderHint(QPainter::Qt4CompatiblePainting);QPainter

編集:

境界線の色と一緒に完全な丸みを帯びた長方形を生成するための解決策を見つけました。これはQPushButton、たとえば、の境界線で使用される丸みを帯びた長方形と同じように見えます。paintEventこれは私がこれを達成するために実装した方法です:

void MyButtonGroup::paintEvent(QPaintEvent * e)
{
    int borderSize = 5;
    QColor borderColor = Qt::red;
    QColor backgroundColor = Qt::blue;
    int borderRadius = 3;

    QPen pen;
    pen.setWidth(borderSize);
    pen.setColor(borderColor);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(pen);

    QRectF rect(rect().x() + borderSize / 2,
                rect().y() + borderSize / 2,
                rect().width() - borderSize,
                rect().height() - borderSize);


    if(borderSize % 2 == 0)
    {
        painter.drawRoundedRect(rect,
                                borderSize,
                                borderSize);
    }
    else
    {
        painter.drawRoundedRect(rect.translated(0.5, 0.5),
                                borderRadius,
                                borderRadius);
    }

    QBrush brush(backgroundColor);
    pen.setBrush(brush);
    painter.setBrush(brush);

    if(borderSize % 2 == 0)
    {
        painter.drawRoundedRect(rect,
                                borderRadius,
                                borderRadius);
    }
    else
    {
        painter.drawRoundedRect(rect.translated(0.5, 0.5),
                                borderRadius,
                                borderRadius);
    }

    QWidget::paintEvent(e);
}

この結果を達成するのが少し難しいと思ったので、これを投稿します:

ここに画像の説明を入力してください

于 2014-09-22T18:32:07.923 に答える
3

半分のピクセルオフセットを追加してみてください(例:)rect.translated(0.5,0.5)

QRectF rect(0,0,48,11);
painter.setRenderHint(QPainter::Antialiasing,false);
painter.drawRoundedRect( rect.translated(0.5,0.5), 2.0, 2.0 );

これは、 2つのピクセルの間に整数値を配置する座標系に関係していると思います。

アンチエイリアスを使用して描画し、1ピクセル幅のペンを使用する場合、正確な整数座標で描画すると、代わりに2ピクセル幅の線になります。この0.5ピクセルのオフセットでのみ、正確に1ピクセル幅の線が得られます。

QRectF rect(0,0,48,11);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setBrush(Qt::NoBrush);
painter.setPen( Qt::white );
painter.drawRoundedRect( rect.translated(0.5,0.5), 2.0,2.0 );
于 2013-08-08T12:02:18.593 に答える
2

RoundRectを描画する最良の方法はPathです。 http://developer.nokia.com/community/wiki/Qt_rounded_rect_widget

void fillRoundRect(QPainter& painter, QRect r, int radius)
{
    painter.setRenderHint(QPainter::Antialiasing,true);

    QPainterPath rounded_rect;
    rounded_rect.addRoundRect(r, radius, radius);
    painter.setClipPath(rounded_rect);

    painter.fillPath(rounded_rect,painter.brush());     
    painter.drawPath(rounded_rect);     
}
于 2014-09-26T11:20:33.460 に答える
0

レンダリングヒントを試してみてください1)アンチエイリアスを無効にします。2)SmoothPixmapTransformを有効にします

しかし、それが役立つという保証はありません。

于 2011-06-28T14:30:16.873 に答える
0

私はここで答えからすべてのヒントを試しましたが、何もうまくいきません。しかし、これらのコードスニペットに基づいて、次の解決策を見つけました。

デフォルトで設定されm_pPainter->setRenderHint(QPainter::Qt4CompatiblePainting, true)、width%2==0の角の丸い長方形に対してのみ無効にします。

QRect rect = ConvertRectangle(rectangle);

int nPenWidth = m_pPainter->pen().width();
if ( nPenWidth % 2 == 0 )
    m_pPainter->setRenderHint(QPainter::Qt4CompatiblePainting, false);

m_pPainter->drawRoundedRect(rect, dbRadiusX, dbRadiusY);

if ( nPenWidth % 2 == 0 )
    m_pPainter->setRenderHint(QPainter::Qt4CompatiblePainting, true);
于 2014-12-03T13:43:44.020 に答える