2012-02-21 25 views
2

我通過QWidget派生自己的簡單小部件,並試圖讓它在其paintEvent()中繪製漸變。我在paintEvent中設置了一個斷點,但是它永遠不會被調用,即使當我調整窗口大小時也是如此。這個小部件是設計器內部推廣的QWidget。 這是我的對象代碼 - 我實際上並沒有讀取漸變顏色,只是試圖讓paintEvent()首先啓動hehe。 首先,頭文件:獲取派生QWidget繪製自己的問題

#ifndef GRADIENT_H 
#define GRADIENT_H 

#include <QBrush> 
#include <QPen> 
#include <QPixmap> 
#include <QWidget> 


class Gradient : public QWidget 
{ 
    Q_OBJECT 

public: 
    Gradient(QWidget *parent = 0); 

    QSize minimumSizeHint() const; 
    QSize sizeHint() const; 

public slots: 

protected: 
    void paintEvent(QPaintEvent *event); 
    void resizeEvent(QResizeEvent *event); 

private: 

}; 

#endif // GRADIENT_H 

然後,在.cpp:

#include <QtGui> 
#include <QPen> 

#include "gradient.h" 


Gradient::Gradient(QWidget *parent) 
    : QWidget(parent) 
{ 

    //setBackgroundRole(QPalette::Base); 
    //setAutoFillBackground(true); 
} 

QSize Gradient::minimumSizeHint() const 
{ 
    return QSize(20, 256); 
} 

QSize Gradient::sizeHint() const 
{ 
    return QSize(20, 512); 
} 

void Gradient::resizeEvent(QResizeEvent * /* event */) 
{ 
    //update(); 
    repaint(); 
} 

void Gradient::paintEvent(QPaintEvent * /* event */) 
{ 
    QPainter painter(this); 
    painter.fillRect(rect(), Qt::black); 
    painter.setPen(QPen(Qt::blue,1)); 
    // painter.setBrush(?); 

    for (int y = 0; y < height(); ++y) 
    { 
     painter.save(); 
     //painter.setPen(); <---here I plan to set different colors from a dynamic table 
     painter.translate(0, y); 

     painter.drawLine(0, 0, width(), 0); 

     painter.restore(); 
    } 
    painter.drawRect(QRect(0, 0, width() - 1, height() - 1)); 
} 

回答

1

無需調用update()repaint()resizeEvent()內。但是這也不應該破壞任何東西。推廣的東西肯定有問題,因爲paintEvent()覆蓋是正確的。我把它粘貼到QWidget子類中,並且工作正常。也許一個乾淨的所有和重建?

+0

嗯,做小部件得到一個初始paintEvent(),當他們被創建/應用程序加載/主窗口顯示?如果沒有,我可能需要找到另一種方式來做到這一點。感謝您測試代碼:) – Darren 2012-02-22 00:07:42

+0

好吧,我重新檢查了evrything,而且看起來我從來沒有收到過這些事件,因爲在編輯之間,QTCreator應用程序失去了對我的派生類型的「提升」部件。要將您標記爲答案,謝謝! – Darren 2012-02-22 01:27:51