I created widget of led light with radial gradient,(found example in internet). It was inheritated from qwidget and all type of borders that I could use in there are presented By QPaint. But I need more difficult shape for this LED, I saw this kind of borders in QFrame class, I inheritade my widget from it, but when I wanted to set type of border to my widget, nothing happened. May be some mistake in paintEvent method?
ledindicator.cpp
#include "ledindicator.h"
#include <QPainter>
LedIndicator::LedIndicator(QWidget *parent) :
QFrame(parent)
{
setFixedSize(218, 218);
lit = false;
ledOnColor=Qt::green;
ledOffColor=Qt::red;
ledOnPattern = Qt::SolidPattern;
ledOffPattern = Qt::SolidPattern;
ledSize=400;
}
void LedIndicator::paintEvent(QPaintEvent *) {
QPainter p(this);
//QPen pen(Qt::black, 3, Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin);
//p.setPen(pen);
QRadialGradient radialGradient(ledSize, ledSize, ledSize , ledSize + 7, ledSize + 7);
radialGradient.setColorAt(0.0, Qt::white);
radialGradient.setColorAt(0.2, Qt::green);
radialGradient.setColorAt(1.0, Qt::green);
if (lit){
p.setBrush(QBrush( radialGradient)); //
} else {
p.setBrush(QBrush( radialGradient)); //ledOffColor,
}
p.drawRect(0,0,ledSize,ledSize);
QFrame::setFrameStyle( QFrame::Box | QFrame::Raised);//setFrameStyle(QFrame::Box|QFrame::Raised);
QFrame::setLineWidth(0);
QFrame::setMidLineWidth(3);
//setLineWidth(0);
//
//setFrameShape( QFrame::Shape);
}
void LedIndicator::switchLedIndicator() {
lit = ! lit;
repaint();
}
void LedIndicator::setState(bool state)
{
lit = state;
repaint();
}
void LedIndicator::toggle()
{
lit = ! lit;
repaint();
}
void LedIndicator::setOnColor(QColor onColor)
{
ledOnColor=onColor;
repaint();
}
void LedIndicator::setOffColor(QColor offColor)
{
ledOffColor=offColor;
repaint();
}
void LedIndicator::setOnPattern(Qt::BrushStyle onPattern)
{
ledOnPattern=onPattern;
repaint();
}
void LedIndicator::setOffPattern(Qt::BrushStyle offPattern)
{
ledOffPattern=offPattern;
repaint();
}
void LedIndicator::setLedSize(int size)
{
ledSize=size;
setFixedSize(size+10, size+10);
repaint();
}
ledindicator.h
#ifndef LEDINDICATOR_H
#define LEDINDICATOR_H
#include <QWidget>
#include <QRadialGradient>
#include <QPen>
#include <QLabel>
class LedIndicator: public QFrame {
Q_OBJECT
public:
LedIndicator(QWidget *parent = 0);
void setState(bool state);
void toggle();
void setOnColor(QColor onColor);
void setOffColor(QColor offColor);
void setOnPattern(Qt::BrushStyle onPattern);
void setOffPattern(Qt::BrushStyle offPattern);
void setLedSize(int size);
public slots:
void switchLedIndicator();
protected:
void paintEvent(QPaintEvent *);
private:
QPen pen;
bool lit;
QColor ledOnColor;
QColor ledOffColor;
Qt::BrushStyle ledOnPattern;
Qt::BrushStyle ledOffPattern;
int ledSize;
};
#endif // LEDINDICATOR_H
You have to draw on top of the
QFrame, the rectangle inside the edge you get throughcontentsRect(). ThesetFrameStyle(),setLineWidth(), andsetLineWidth()methods do it in the constructor since you will call it only once.ledindicator.h
ledindicator.cpp