2010-06-01 31 views
3

Je souhaite modifier périodiquement la couleur du texte dans un rectangle. Voici mon procès:QGraphicsItem repaint

TrainIdBox::TrainIdBox() 
{ 
    boxRect = QRectF(0,0,40,15); 
    testPen = QPen(Qt:red); 
    i=0; 
    startTimer(500); 
} 

QRectF TrainIdBox::boundingRect() const 
{ 
return boxRect; 
} 

void TrainIdBox::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    Q_UNUSED(widget); 
    Q_UNUSED(option); 

    painter->setPen(QPen(drawingColor,2)); 
    painter->drawRect(boxRect); 
    painter->setPen(testPen); 
    painter->drawText(boxRect,Qt::AlignCenter,"TEST"); 

} 
void TrainIdBox::timerEvent(QTimerEvent *te) 
{ 
    testPen = i % 2 == 0 ? QPen(Qt::green) : QPen(Qt::yellow); 
    i++; 
    update(boxRect); 
} 

Ce code ne fonctionne pas correctement. Qu'est-ce qui ne va pas?

+0

Je suppose que TrainIdBox hérite de QGraphicsItem, au moins quelque part le long de la ligne? Sinon, de quoi hérite-t-elle? –

Répondre

2

Si vous héritez de QGraphicsObject ... Je donne ici un exemple:

Declare:

class Text : public QGraphicsObject 
    { 
     Q_OBJECT 

    public: 
     Text(QGraphicsItem * parent = 0); 
     void paint (QPainter * painter, 
        const QStyleOptionGraphicsItem * option, QWidget * widget ); 
     QRectF boundingRect() const ; 
     void timerEvent (QTimerEvent * event); 

    protected: 
     QGraphicsTextItem * item; 
     int time; 
    }; 

mise en œuvre:

Text::Text(QGraphicsItem * parent) 
    :QGraphicsObject(parent) 
{ 
    item = new QGraphicsTextItem(this); 
    item->setPlainText("hello world"); 

    setFlag(QGraphicsItem::ItemIsFocusable);  
    time = 1000; 
    startTimer(time); 
} 

void Text::paint (QPainter * painter, 
        const QStyleOptionGraphicsItem * option, QWidget * widget ) 
{ 
    item->paint(painter,option,widget);  
} 

QRectF Text::boundingRect() const 
{ 
    return item->boundingRect(); 
} 

void Text::timerEvent (QTimerEvent * event) 
{ 
    QString timepass = "Time :" + QString::number(time/1000) + " seconds"; 
    time = time + 1000; 
    qDebug() << timepass; 
} 

bonne chance

0

Vérifiez si la minuterie a été correctement initialisé, il ne devrait pas revenir 0.

Essayez de changer aussi la couleur de pinceau utilisé pour peindre.

Je vérifie votre code quand je reçois du temps libre chez moi, mais ce ne sera pas avant dimanche.

0

Comme le point de base, vous pouvez regarder Wiggly Example et trouver vous-même quelques erreurs dans le code, ce qui est beaucoup mieux. Pour Qt, à mon avis, c'est une bonne pratique à regarder parfois Exemples et démos application.

Bonne chance!

3

QGraphicsItem n'est pas dérivé de QObject et n'a donc pas de file d'attente d'événements, nécessaire pour gérer les événements de temporisation. Essayez d'utiliser QGraphicsObject ou l'héritage multiple de QGraphicsItem et QObject (ce qui est exactement ce que fait QGraphicsObject).