1

基本的に私がやりたいのは、リスト内の番号ごとに長方形を描くことです。数値が大きいほど、長方形は大きくなります。私の問題は、実際にそれを段階的に実行し、すべての描画の間に数秒待つことです。私はいくつかの解決策を探しましたが、この特定のケースでそれらを機能させることができません。fflushを使用して、バッファー内にあるものをすべて解放できることを確認しましたが、これにどのように使用できるかわかりません。

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
int weight=300/lista.size;
int posx=weight;
for (int i=1; i<=lista.size; i++){
        List_node * node = list.get_element_at(i);
            int num=node->getValue(); //this returns the value of the node
        if (i==3){
                painter.setBrush(QBrush(Qt::red, Qt::SolidPattern)); // this line is to draw a rectangle with a different color. Testing purposes.
         }
        painter.drawRect(posx,400-(num*10),weight,num*10);
        sleep(1); //this sleep isn't working correctly.
        painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
        posx+=weight;
 }

どんな助けでも本当にありがたいです。

4

1 に答える 1

2

sleep() はこれには機能しません。Qt イベント ループをブロックし、Qt がスリープしている間はその仕事を行わないようにします。

必要なことは、描画する画像の現在の状態を記憶するために 1 つ以上のメンバー変数を保持し、現在の 1 つの画像のみを描画するために paintEvent() を実装することです。paintEvent() (Qt の GUI スレッドで実行されているすべての関数と同様) は常にすぐに戻り、スリープまたはブロックすることはありません。

次に、アニメーション部分を実装するために、QTimer オブジェクトを設定して、定期的な間隔でスロットを呼び出します (たとえば、1000 ミリ秒ごとに 1 回、または好きな頻度で)。そのスロットを実装して、メンバ変数をアニメーション シーケンスの次の状態 (たとえば、rectangle_size++ など) に調整してから、ウィジェットで update() を呼び出します。update() は Qt にできるだけ早くウィジェットで paintEvent() を再度呼び出すように指示するため、スロット メソッドが戻った直後にディスプレイが次のフレームに更新されます。

以下は、この手法の簡単な例です。実行すると、赤い四角形が大きくなったり小さくなったりします。

// begin demo.h
#include <QWidget>
#include <QTimer>

class DemoObj : public QWidget
{
Q_OBJECT

public:
   DemoObj();

   virtual void paintEvent(QPaintEvent * e);

public slots:
   void AdvanceState();

private:
   QTimer _timer;
   int _rectSize;
   int _growthDirection;
};

// begin demo.cpp
#include <QApplication>
#include <QPainter>
#include "demo.h"

DemoObj :: DemoObj() : _rectSize(10), _growthDirection(1)
{
   connect(&_timer, SIGNAL(timeout()), this, SLOT(AdvanceState()));
   _timer.start(100);   // 100 milliseconds delay per frame.  You might want to put 2000 here instead
}

void DemoObj :: paintEvent(QPaintEvent * e)
{
   QPainter p(this);
   p.fillRect(rect(), Qt::white);
   QRect r((width()/2)-_rectSize, (height()/2)-_rectSize, (_rectSize*2), (_rectSize*2));
   p.fillRect(r, Qt::red);
}

void DemoObj :: AdvanceState()
{
   _rectSize += _growthDirection;
   if (_rectSize > 50) _growthDirection = -1;
   if (_rectSize < 10) _growthDirection = 1;
   update();
}

int main(int argc, char ** argv)
{
   QApplication app(argc, argv);

   DemoObj obj;
   obj.resize(150, 150);
   obj.show();
   return app.exec();
}
于 2012-09-21T04:13:32.687 に答える