QGraphicsItem Repaint
-
05-10-2019 - |
Вопрос
Я хочу периодически изменить цвет текста внутри прямоугольника. Вот мое испытание:
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);
}
Этот код не работает должным образом. Что случилось?
Решение
Если вы унаследовали от QGraphicsObject ... Я даю здесь пример:
Объявить:
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;
}
удачи
Другие советы
QGraphicsItem не получен из Qobject и, следовательно, не имеет очереди событий, которая необходима для обработки событий таймера. Попробуйте использовать QGraphicsObject. Или многократное наследование QGraphicsitem и Qobject (что именно то, что делает QGraphicsObject).
Проверьте, был ли таймер правильно инициализирован, он не должен возвращаться 0.
Попробуйте также изменять цвет кисти, используемой для краски.
Я проверяю свой код, когда у меня есть свободное время в доме, но это не будет до воскресенья.
Как базовая точка, вы могли бы посмотреть Wiggly пример И найдите некоторые ошибки в вашем коде, что намного лучше. Для Qt, на мой взгляд, это хорошая практика, чтобы посмотреть иногда в Примеры и демонстрация заявление.
Удачи!