2017-02-13 46 views
0

在Qt中,我有一個5px寬度和4px高度的Qpixmap,我用寬度爲.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

的交替黑色和白色長方形既然你沒有抗鋸齒繪製,微小的像素尺寸變得毫無意義 - 有什麼辦法?

像素圖的大小以像素爲單位給出。您的像素圖包含5x4 = 20像素。你正在試圖畫20個矩形。爲了達到這個目的,每個矩形必須是一個正方形,只有一個像素寬和高。唉,你試圖繪製比像素小12.5倍的方塊。這沒有多大意義,我不知道你從哪裏得到0.08的價值。只需畫出一個像素寬的方塊。

實施例:

// 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(); 
}