gpt4 book ai didi

c++ - 在 qt c++ 中使用 paintevent 的循环中 sleep

转载 作者:行者123 更新时间:2023-11-30 04:24:44 24 4
gpt4 key购买 nike

基本上我想做的是为列表中的每个数字绘制矩形。数字越大,矩形越大。我的问题是当我真正想做的时候,一步一步,在每幅画之间等待几秒钟。我已经寻找了一些解决方案,但我无法让它们适用于这种特殊情况。我看到我可以使用 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;
}

非常感谢任何帮助。

最佳答案

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

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

然后,为了实现动画部分,设置一个 QTimer 对象以定期为您调用一个插槽(例如,每 1000 毫秒一次,或者您喜欢的频率)。实现该插槽以将您的成员变量调整到它们在动画序列中的下一个状态(例如 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();
}

关于c++ - 在 qt c++ 中使用 paintevent 的循环中 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12523753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com