È 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);
}
fonte
2010-10-08 23:37:27
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
Non ho mai provato a disegnare su un widget con codice esterno al widget ma QWidget eredita PaintDevice così dovrebbe essere possibile. –
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. " –