2012-02-21 27 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