2017-02-13 5 views
0

QtでQpixmapの幅が5px、高さが4pxですが、幅が.08、高さが.08の四角形で塗りつぶしていますが、形成される矩形は等しくありません私が与えた次元。 私は同じ次元の別の黒と白の長方形を描きたいQPainterのdrawRect関数は、同じ大きさの長方形を与えていません。

QLabel *a=new QLabel(); 
QPixmap b(5,4); 
a->setFixedSize(b.size()); 
QPainter painter(&b); 
heightOfCheckeredBox=.08; 
widthOfCheckeredBox=.08; 
bool switchBetweenBlackAndWhiteBoxRowDirection=true; 
int switchBetweenBlackAndWhiteBoxColumnDirection=0; 
for(qreal i=0;i<4;i+=heightOfCheckeredBox) 
{ 
    for(qreal j=0;j<5;j+=widthOfCheckeredBox) 
    { 
     if(switchBetweenBlackAndWhiteBoxRowDirection) 
     { 



      painter.setPen(Qt::white); 
      painter.setBrush(Qt::white); 

      switchBetweenBlackAndWhiteBoxRowDirection=false; 

     } 
     else 
     { 

      painter.setPen(Qt::gray); 
      painter.setBrush(Qt::gray); 
      switchBetweenBlackAndWhiteBoxRowDirection=true; 
     } 

     QRectF rectangle(j,i,widthOfCheckeredBox,heightOfCheckeredBox); 
     painter.drawRect(rectangle); 

    } 

    switchBetweenBlackAndWhiteBoxColumnDirection++; 
    if(int(switchBetweenBlackAndWhiteBoxColumnDirection)%2==0) 
     switchBetweenBlackAndWhiteBoxRowDirection=true; 
    else 
     switchBetweenBlackAndWhiteBoxRowDirection=false; 
} 

a->setPixmap(b); 
a->show(); 
+1

それは、幅と高さのピクセルの100分の8ある四角形を描画するために何を意味するのか自問してみてください。根底にあるレンダリングアルゴリズムは何を期待していますか? –

+1

全体(またはほぼ全体)のピクセルを使用できるスケールで描画し、既知のアルゴリズムで縮小します。 – phyatt

+0

私はイメージを持っています私はそれがバックグラウンドで別のイメージを持っている必要がありますそれは私が白と黒のボックスで今異なるイメージのために作っている私のチェッカーされたイメージです私はそれが終わった後、ビューで –

答えて

0

あなたはアンチエイリアスなしで描画しているので、小さなピクセルサイズは意味をなさない - あなたは何を期待したのですか?

ピクセルマップのサイズはピクセル単位です。 pixmapには5x4 = 20ピクセルが含まれています。あなたはそれに20の長方形を描こうとしています。これを実行するには、各矩形は正確に1ピクセル幅の正方形でなければなりません。ああ、ピクセルよりも12.5倍小さい四角形を描こうとしています。それはあまり意味がありません、そして私は0.08の値をどこから得たか分かりません。 1ピクセル幅の四角形を描くだけです。

例:

// https://github.com/KubaO/stackoverflown/tree/master/questions/checkered-paint-42205180 
#include <QtWidgets> 

QPixmap checkers(const QSizeF & rectSize, const QSize & pixmapSize) { 
    QPixmap pixmap{pixmapSize}; 
    QPainter painter{&pixmap}; 
    painter.setPen(Qt::NoPen); 
    const QColor colors[] = {Qt::white, Qt::black}; 
    QPointF pos{}; 
    bool oddRow{}, color{}; 
    while (pos.y() < pixmap.height()) { 
     painter.setBrush(colors[color ? 1 : 0]); 
     painter.drawRect({pos, rectSize}); 
     color = !color; 
     pos.setX(pos.x() + rectSize.width()); 
     if (pos.x() >= pixmap.width()) { 
     pos.setX({}); 
     pos.setY(pos.y() + rectSize.height()); 
     oddRow = !oddRow; 
     color = oddRow; 
     } 
    } 
    return pixmap; 
} 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QLabel label; 
    auto pix = checkers({1, 1}, {60, 30}); 
    label.resize(200, 200); 
    label.setAlignment(Qt::AlignCenter); 
    label.setPixmap(pix); 
    label.show(); 
    return app.exec(); 
} 
関連する問題