2010-06-01 4 views
3

Я хочу периодически менять цвет текста внутри прямоугольника. Вот моя проба: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); 
} 

Этот код не работает должным образом. Что не так?

+0

Я полагаю, TrainIdBox унаследован от QGraphicsItem, по крайней мере, где-то вдоль линии? Если нет, от чего это унаследовано? –

ответ

2

Если вы унаследовали от QGraphicsObject ... Привожу пример:

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; 
    }; 

реализация:

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; 
} 

удачи

0

Проверьте таймер был правильно инициализирован, он не должен возвращать 0.

Попробуйте также изменяя цвет кисти используется для рисования.

Я проверяю ваш код, когда я получаю свободное время в доме, но это не будет до воскресенья.

0

В качестве базовой точки вы могли бы посмотреть Wiggly Example и найти в себе ошибки в себе, что намного лучше. Для Qt, на мой взгляд, это хорошая практика иногда смотреть в Примеры и демонстрации.

Удачи вам!

3

QGraphicsItem не является производным от QObject и, следовательно, не имеет очереди событий, которая необходима для обработки событий таймера. Попробуйте использовать QGraphicsObject или множественное наследование QGraphicsItem и QObject (это именно то, что делает QGraphicsObject).