2010-10-08 59 views
13

的Qt4,QtCreatorQt4如何在小部件內部繪製?

我想裏面控件繪製:

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

但是,當我按下按鈕沒有任何反應。

如何做到這一點?

回答

21

您需要覆蓋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); 
} 
+0

有沒有任何方法來繪製沒有覆蓋?或者是否有任何組件可以在沒有任何事件的情況下繪製,如TImage或TForm或包含VCL(Delphi)中的TCanvas的任何其他組件? (在德爾福可以只寫Form1.Canvas.Circle(...),只要我需要它,而不僅僅在onpaint事件) – Astronavigator 2010-10-08 23:59:31

+0

我從來沒有真正嘗試繪製一個小部件外部代碼的部件,但QWidget繼承PaintDevice所以它應該是可能的。 – 2010-10-09 00:23:57

+0

從QPainter的文檔中劃傷。「警告:當paintdevice是一個小部件時,QPainter只能在paintEvent()函數或paintEvent()調用的函數中使用;除非Qt :: WA_PaintOutsidePaintEvent widget屬性已設置,在Mac OS X和Windows上,只能在paintEvent()函數中繪製,而不管此屬性的設置如何。「 – 2010-10-09 00:50:13

0

如果覆蓋由阿諾德·斯彭斯描述的油漆的方法,你應該調用父的paintEvent或者你結束了一個小工具,只能說明你在白色背景上的矩形。