您需要覆蓋paintEvent()並在那裏進行繪畫。你並不需要begin()
和end()
。聲明畫家
QPainter painter(this);
構造函數將處理begin()
,當painter
對象超出範圍,被破壞end()
將被調用。
您也不需要點擊事件來觸發繪畫。當小部件需要繪製自己時,將調用paintEvent()
。您可以使用按鈕單擊來切換paintEvent()
檢查的布爾值,以確定它是否應顯示矩形和圓弧。切換變量後,請確保您撥打update()
。
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:
爲了避免覆蓋小部件的paintEvent()
,你可以使用一個QLabel
和像素圖分配給它和油漆了這一點。注意:據我所知,每次修改時都需要設置像素圖。
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);
}
有沒有任何方法來繪製沒有覆蓋?或者是否有任何組件可以在沒有任何事件的情況下繪製,如TImage或TForm或包含VCL(Delphi)中的TCanvas的任何其他組件? (在德爾福可以只寫Form1.Canvas.Circle(...),只要我需要它,而不僅僅在onpaint事件) – Astronavigator 2010-10-08 23:59:31
我從來沒有真正嘗試繪製一個小部件外部代碼的部件,但QWidget繼承PaintDevice所以它應該是可能的。 – 2010-10-09 00:23:57
從QPainter的文檔中劃傷。「警告:當paintdevice是一個小部件時,QPainter只能在paintEvent()函數或paintEvent()調用的函數中使用;除非Qt :: WA_PaintOutsidePaintEvent widget屬性已設置,在Mac OS X和Windows上,只能在paintEvent()函數中繪製,而不管此屬性的設置如何。「 – 2010-10-09 00:50:13