[英]Continuously drawing object using Qt and C++
我有一个使用互联网无法解决的问题。 我有标签,并在上面设置了像素图。 我也把它放在按钮(QPushButton)所在的主窗口(小部件)上。 我想这样做:
pause()
停止绘图 第二个很简单,它是空插槽:
void pause() {}
但是起初我尝试使用循环
while(true)
draw();
但它使程序崩溃(循环)。
知道如何解决吗?
您永远不应阻塞主线程。 这将导致操作系统认为您的应用程序已挂起。 实际上,将任何执行时间超过50毫秒的代码移动到另一个线程以保持主线程的响应是一个好习惯,尤其是在Qt也是GUI线程的情况下。
您应该使用事件驱动的方法,该方法不会阻塞线程。
class YourClass : public QObject { // QObject or derived
Q_OBJECT
public:
YourClass() { connect(&timer, &Timer::timeout, this, &YourClass::draw); }
public slots:
void start() { timer.start(33); }
void pause() { timer.stop(); }
private:
QTimer timer;
void draw() { ... }
};
调用start()
,将每33毫秒调用一次draw()
。 pause()
将有效地停止该操作,直到再次调用start()
为止。 您可以通过调整计时器的时间间隔来控制调用draw()
的速率,默认情况下为0,如果绘图过大,则应调整为每秒所需的成帧器。 在上面的示例中,它是33毫秒,大约是30 FPS。
然后,您应该以一定的时间间隔调用draw()
,而不是使用它停止整个GUI线程。
为此,有QTimer
:
QTimer timer; // should be a member, a pointer optionally - you then do new Qtimer(this);
connect(&timer, &QTimer::timeout, draw);
timer.start(500); // in milliseconds
// assuming you are calling this from member function of QObject-deriving class
// and draw is a non-member function
如果您知道要进行连接,则可以将其连接到任何东西...
使用QThread
可以完成同样的操作,并将其置于该循环中。
无论如何 ,我不知道如何使用空的pause()
停止绘图。 您不再次暂停应用程序吗? 只是做timer.stop();
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.