2010-10-08 11 views
13

Qt4, QtCreatorQt4 Come disegnare all'interno di un widget?

sto cercando di disegnare all'interno Widget:

void Widget::on_pushButton_clicked() 
{ 
    QPainter painter; 

    painter.begin(ui->label); 

    QRectF rectangle(10.0, 20.0, 80.0, 60.0); 
    int startAngle = 30 * 16; 
    int spanAngle = 120 * 16; 
    painter.drawArc(rectangle, startAngle, spanAngle); 

    painter.end(); 
} 

Ma quando si preme il pulsante non succede nulla.

Come procedere correttamente?

risposta

21

È necessario eseguire l'override di paintEvent() e fare la tua pittura lì. Non hai davvero bisogno dello begin() e end(). Dichiarare pittore con

QPainter painter(this); 

Il costruttore gestirà begin() e end() sarà chiamato quando l'oggetto painter passa nell'ambito e viene distrutto.

Inoltre, non è necessario l'evento click per attivare il dipinto. paintEvent() verrà chiamato ogni volta che il widget deve disegnare se stesso. È possibile utilizzare il pulsante clic per attivare o disattivare un valore booleano che controlla lo paintEvent() per determinare se visualizzare o meno il rettangolo e l'arco. Assicurati di chiamare lo update() dopo aver attivato la variabile.

void Widget::on_pushButton_clicked() 
{ 
    drawShapes = !drawShapes; 
    update(); 
} 

void Widget::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 

    if(drawShapes) 
    { 
     QRectF rectangle(10.0, 20.0, 80.0, 60.0); 
     int startAngle = 30 * 16; 
     int spanAngle = 120 * 16; 
     painter.drawArc(rectangle, startAngle, spanAngle); 
    } 
} 

UPDATE:

Per evitare di dover ignorare il paintEvent() di un widget, è possibile utilizzare un QLabel e assegnare una mappa di pixel ad esso e dipingere a questo. Nota: per quanto ne so, è necessario impostare la pixmap ogni volta che la si modifica.

void MainForm::slot_buttonClick() 
{ 
    QPixmap pixmap(100,100); 
    pixmap.fill(QColor("transparent")); 

    QPainter painter(&pixmap); 
    painter.setBrush(QBrush(Qt::black)); 
    painter.drawRect(10, 10, 100, 100); 

    label.setPixmap(pixmap); 
} 
+0

C'è un modo per dipingere senza escludere? O c'è qualche componente su cui posso disegnare senza alcun evento, come TImage o TForm o qualsiasi altro componente contenente TCanvas in VCL (Delphi)? (In Delphi potrebbe semplicemente scrivere Form1.Canvas.Circle (...) ogni volta che ne ho bisogno, non solo all'interno dell'evento onpaint) – Astronavigator

+0

Non ho mai provato a disegnare su un widget con codice esterno al widget ma QWidget eredita PaintDevice così dovrebbe essere possibile. –

+0

Scratch che, dai documenti per QPainter .. "Attenzione: quando il paintdevice è un widget, QPainter può essere utilizzato solo all'interno di una funzione paintEvent() o in una funzione chiamata da paintEvent(), ovvero a meno che Qt :: WA_PaintOutsidePaintEvent l'attributo widget è impostato. Su Mac OS X e Windows, puoi dipingere solo in una funzione paintEvent() indipendentemente dalle impostazioni di questo attributo. " –

0

Se si sovrascrive la vernice-metodo descritto da Arnold Spence, si dovrebbe chiamare paintEvent del genitore o si finisce con un widget che mostra solo rettangolo su uno sfondo bianco.