cześć, napisałem klasę diody(paintEvent) w zależności od atrybutu mode, w odpowiedzi na metodę setOn() powinna 1-jednokrotnie zmienić kolor lub 2-zmieniać kolor na przemian pomiędzy dwoma(szary i ustawiony metodą setColor();)
O ile dla jednego obiektu klasy wszystko jest ok. tak przy tablicy wszystkie obiekty zachowują się jakby mode==1 mimo tego że zostało ustawione na 2 lub 3.
W przypadku tablicy prawidłowo funkcjonuje tylko ostatni jej element.
pytania:
dlaczego i jak to rozwiązać?
dioda.h
#ifndef DIODA_H
#define DIODA_H
#include <QWidget>
#include <QPainter>
#include <QTimer>
#define FAST_DELAY 125
#define SLOW_DELAY 300
class dioda : public QWidget{
Q_OBJECT
private:
void paintEvent(QPaintEvent *);
void blink(int delay);
QColor paintColor;
QColor onColor;
QColor offColor;
bool state;
int shift;
int radius;
int mode;
protected:
QTimer *timer;
public:
dioda();
void setOnColor(QColor color);
void setOffColor(QColor color);
bool setMode(int i);
void setShift(int s);
void setRadius(int r);
public slots:
void setOn();
void setOff();
};
#endif // DIODA_H
dioda.cpp
#include "dioda.h"
dioda::dioda(){
offColor = Qt::gray;
onColor = Qt::white;
paintColor = offColor;
shift = 10;
radius = 10;
state = false;
mode = 1;
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(setOn()));
}
void dioda::paintEvent(QPaintEvent *){
QPainter dioda(this);
dioda.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing);
QRadialGradient gradient(shift+radius/2, shift+radius/2, radius/2, shift+radius/4, shift+radius/4);
paintColor == Qt::black ? gradient.setColorAt(0.2, Qt::darkGray) : gradient.setColorAt(0.2, Qt::white);
gradient.setColorAt(0.8, paintColor);
gradient.setColorAt(1.0, Qt::black);
dioda.setPen((QPen(Qt::black, 0, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)));
dioda.setBrush(QBrush(gradient));
dioda.drawEllipse(shift,shift,radius,radius);
}
void dioda::setOnColor(QColor color){
onColor = color;
repaint();
}
void dioda::setOffColor(QColor color){
onColor = color;
repaint();
}
bool dioda::setMode(int i){
if(i<1 || i>3) return false;
mode = i;
/*if(i>1) {
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(setOn()));
}*/
return true;
}
void dioda::setOn(){
switch(mode){
case 1:
paintColor = onColor;
state = true;
repaint();
break;
case 2:
blink(SLOW_DELAY);
break;
case 3:
blink(FAST_DELAY);
break;
default:break;
}
}
void dioda::setOff(){
paintColor = offColor;
timer->stop();
state = false;
repaint();
}
void dioda::setShift(int s){
shift = s;
repaint();
}
void dioda::setRadius(int r){
radius = r;
repaint();
}
void dioda::blink(int delay){
if(state) paintColor = offColor;
else paintColor = onColor;
state = !state;
repaint();
timer->start(delay);
}
konfiguracja w zestawie
QVBoxLayout *set_2 = new QVBoxLayout;
for(int i=0; i<ILOSC_KONTROLEK; ++i){
led[i] = new dioda();
led[i]->setShift(shitf);
led[i]->setRadius(PROMIEN);
opis[i]->setFont(czcionka);
set_1->addWidget(led[i]);
set_2->addWidget(opis[i],0,Qt::AlignLeft);
}
led[0]->setOnColor(Qt::green);
led[1]->setOnColor(QColor::QColor(255,153,0));
led[2]->setOnColor(Qt::green);
led[2]->setMode(1);
led[3]->setOnColor(Qt::yellow);
led[4]->setOnColor(Qt::yellow);
led[5]->setOnColor(Qt::green);
led[5]->setMode(1);
led[6]->setOnColor(Qt::red);
led[6]->setMode(2);
prawidłowo działa tylko led[6] :/