3

長方形内のテキストの色を定期的に変更したい。これが私の裁判です:

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

このコードは正しく機能しません。なにが問題ですか?

4

4 に答える 4

3

QGraphicsItemはQObjectから派生していないため、タイマーイベントを処理するために必要なイベントキューがありません。QGraphicsObjectまたはQGraphicsItemとQObjectの多重継承を使用してみてください(これはまさにQGraphicsObjectが行うことです)。

于 2010-06-14T00:37:31.857 に答える
2

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

幸運を

于 2011-10-13T21:32:05.433 に答える
0

タイマーが正しく初期化されているかどうかを確認してください。0を返さないはずです。

ペイントに使用するブラシの色も変更してみてください。

家で自由な時間が取れたらコードをチェックしますが、それは日曜日までにはなりません。

于 2010-06-01T14:42:08.773 に答える
0

ベースポイントとして、Wiggly Exampleを見て、自分でコーディングする際にいくつかのエラーを見つけることができます。これははるかに優れています。Qtの場合、私の意見では、 ExamplesandDemosアプリケーションを時々見ることをお勧めします。

幸運を!

于 2010-06-01T15:17:56.580 に答える