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 在睡眠时完成其工作。

您需要做的是保留一个或多个成员变量来记住要绘制的图像的当前状态,并实现paintEvent() 以仅绘制当前的单个图像。paintEvent() (就像在 Qt 的 GUI 线程中运行的每个函数一样)应该总是立即返回,并且永远不会休眠或阻塞。

然后,为了实现动画部分,设置一个 QTimer 对象以定期为您调用一个槽(例如,每 1000 毫秒一次,或者您喜欢的频率)。实现该插槽以将您的成员变量调整为动画序列中的下一个状态(例如 rectangle_size++ 或其他),然后在您的小部件上调用 update() 。update() 将告诉 Qt 尽快在您的小部件上再次调用 paintEvent(),因此您的显示将在您的 slot 方法返回后很快更新到下一帧。

以下是该技术的一个简单示例;运行时,它显示一个红色矩形越来越大:

// 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 回答