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] :/