C++ 在qt c+;中使用paintevent的循环中睡眠+;

C++ 在qt c+;中使用paintevent的循环中睡眠+;,c++,qt,loops,sleep,paintevent,C++,Qt,Loops,Sleep,Paintevent,基本上我想做的是为列表中的每个数字绘制矩形。数字越大,矩形越大。 我的问题是当我真的想做的时候,一步一步,在每次画画之间等待几秒钟。我已经寻找了一些解决方案,但我无法让它们在这个特殊情况下发挥作用。我看到我可以使用fflush来释放缓冲区中的任何内容,但我不知道如何使用它来实现这一点 QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.setBrush(QBrush(Qt::gr

基本上我想做的是为列表中的每个数字绘制矩形。数字越大,矩形越大。 我的问题是当我真的想做的时候,一步一步,在每次画画之间等待几秒钟。我已经寻找了一些解决方案,但我无法让它们在这个特殊情况下发挥作用。我看到我可以使用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;
 }
QPainter painter(本);
painter.setRenderHint(QPainter::抗锯齿,true);
setBrush(QBrush(Qt::green,Qt::SolidPattern));
内部重量=300/列表A.尺寸;
int posx=重量;
for(int i=1;igetValue();//返回节点的值
如果(i==3){
setBrush(QBrush(Qt::red,Qt::SolidPattern));//这条线是用来画一个不同颜色的矩形的。用于测试。
}
油漆工drawRect(posx,400-(数量*10),重量,数量*10);
sleep(1);//此睡眠无法正常工作。
setBrush(QBrush(Qt::green,Qt::SolidPattern));
posx+=重量;
}
任何帮助都将不胜感激。

sleep()对此不起作用——它会阻止Qt事件循环,并阻止Qt在睡眠时执行其工作

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

然后,要实现动画部分,请设置一个QTimer对象,以定期(例如,每1000毫秒一次,或您喜欢的频率)为您调用一个slot。实现该slot以将您的成员变量调整到动画序列中的下一个状态(例如,矩形大小++或其他),然后调用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();
}
//开始demo.h
#包括
#包括
DemoObj类:公共QWidget
{
Q_对象
公众:
DemoObj();
虚拟虚空paintEvent(QPaintEvent*e);
公众时段:
void AdvanceState();
私人:
QTimer\u定时器;
整数大小;
国际增长方向;
};
//开始demo.cpp
#包括
#包括
#包括“demo.h”
DemoObj::DemoObj():_rectSize(10),_growthDirection(1)
{
连接(&_定时器,信号(timeout()),此,插槽(AdvanceState());
_timer.start(100);//每帧延迟100毫秒。您可能希望将2000放在这里
}
void DemoObj::paintEvent(QPaintEvent*e)
{
油漆工p(本);
p、 fillRect(rect(),Qt::white);
QRect r((宽度()/2)-\rectSize,(高度()/2)-\rectSize,(\rectSize*2),(\rectSize*2));
p、 fillRect(r,Qt::红色);
}
void DemoObj::AdvanceState()
{
_rectSize+=\u生长方向;
如果(_rectSize>50)_growthDirection=-1;
如果(_rectSize<10)_growthDirection=1;
更新();
}
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
DemoObj-obj;
对象调整大小(150150);
obj.show();
返回app.exec();
}