2014-07-23 1 views
1

J'essaie de dessiner des losanges avec des couleurs aléatoires dans un QWidget. Et je veux enregistrer le QWidget actuel comme image. J'utilise un tel code pour ce faire:enregistrer les éléments actuels sur qwidget comme image

QPixmap pixmap(this->size()); 
this->render(&pixmap); 
pixmap.save("test.png"); 

Le problème est que le render() semble appeler paintEvent à nouveau, et le paintEvent attirera les grondements avec de nouvelles couleurs au hasard, de sorte que je reçois toujours un autre Image enregistrée par rapport à l'image affichée. Quelqu'un peut-il me dire comment enregistrer le courant QWidget? Merci d'avance.

Code pour grondements dessin:

vide Dialog :: paintEvent (QPaintEvent * e) {

QPainter painter(this); 
QRect background(0,0,this->geometry().width(),this->geometry().height()); 
painter.setBrush(QBrush(Qt::white)); 
painter.setPen(Qt::NoPen); 
//QBrush bbrush(Qt::black,Qt::SolidPattern); 
painter.drawRect(background); 

int width = this->geometry().width(); 
int height = this->geometry().height(); 
//draw rectangles 
int rec_size=64; 
int rows=0; 
int cols=0; 

rows=floor((double)height/(double)rec_size); 
cols=floor((double)width/(double)rec_size); 

QPointF points[4]; // QRect rec(0,0,rec_size,rec_size); 

for (int i=0;i<floor(rows);i++){ 
    for (int j=0;j<floor(cols);j++){ 
     painter.setBrush(QBrush(colors[rand() % color_size])); 


     //QPainter painter(this); 
     points[0] = QPointF(rec_size*(j),rec_size*(i+0.5)); 
     points[1] = QPointF(rec_size*(j+0.5),rec_size*(i)); 
     points[2] = QPointF(rec_size*(j+1),rec_size*(i+0.5)); 
     points[3] = QPointF(rec_size*(j+0.5),rec_size*(i+1)); 

     painter.drawPolygon(points, 4); 

    } 
} 
painter.end(); 

}

+0

Correct: dessinez ce que vous devez 'QImage', et d'en tirer' QImage' sur l'événement de peinture. –

Répondre

1

Vous pouvez avoir une variable de membre de classe de type booléen pour vérifier dans le paintEvent si une couleur aléatoire doit être utilisée. En outre une variable pour enregistrer l'index de la dernière couleur utilisée est nécessaire:

bool isRandom; 
int lastColor; 

Le paintEvent devrait ressembler à:

void Dialog::paintEvent(QPaintEvent *e) { 

    ... 

    if(isRandom) 
    { 
     lastColor = rand() % color_size; 
     painter.setBrush(QBrush(colors[lastColor])); 
    } 
    else 
     painter.setBrush(QBrush(colors[lastColor])); 

    ... 

} 

La variable a vrai lors de l'élaboration du widget régulièrement. Lorsque vous souhaitez enregistrer son image, assigner la variable à false, enregistrez l'image et l'affecter à vrai nouveau:

isRandom = false; 

QPixmap pixmap(this->size()); 
this->render(&pixmap); 
pixmap.save("test.png"); 

isRandom = true; 
+0

Merci. J'essaierai. – newww0

Questions connexes