我创建了一个在小部件上显示圆圈的Qt项目。 然后我有一个方法,每次调用方法时都会在不同的位置重绘圆圈。 我想要的是在for循环中运行该方法,比如十次,并且每隔一秒显示圆圈被重绘的10个位置中的每一个。
有些事情:
void method::paintEvent(QPaintEvent * p)
{
//code
for(int i=0; i<10;i++)//do this every second
{
method(circle[i]); //co-ordinates change
circle[i].pain( & painter); //using QPainter
}
//code
}
我读过QTimer,但不知道如何使用它。睡眠功能不起作用。
答案 0 :(得分:3)
正如您所猜测的,QTimer是在此使用的正确机制。怎么去设置它?
这是一个选项:
class MyClass : public QObject
{
public:
MyClass():i(0)
{
QTimer::singleShot(1000,this,SLOT(callback()));//or call callback() directly here
} //constructor
protected:
unsigned int i;
void paintEvent(QPaintEvent * p)
{
//do your painting here
}
public slots:
void callback()
{
method(circle[i]); //co-ordinates change
//circle[i].pain( & painter); //don't use QPainter here - call update instead
update();
++i;//increment counter
if(i<10) QTimer::singleShot(1000,this,SLOT(callback()));
}
}
答案 1 :(得分:0)
尝试这样的事情:
class MyDrawer : public QObject
{
Q_OBJECT
int counter;
QTimer* timer;
public:
MyDrawer() : QObject(), counter(10)
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(redraw()));
timer->start(1000);
}
public slots:
void redraw()
{
method(circle[i]); //co-ordinates change
circle[i].pain( & painter);
--counter;
if (counter == 0) timer->stop();
}
};
不要忘记在此文件上运行moc
,但如果您的类是QObject,则可能已经执行过了。
答案 2 :(得分:0)
您需要做的就是从计时器事件中触发update()
。 update()
方法会在小部件上安排paintEvent
。
在paintEvent
之外的小部件上绘画是无效的 - 这是我在发布此答案时所有其他答案所犯的错误。仅仅调用paintEvent
方法不是一种解决方法。你应该致电update()
。调用repaint()
也可以,但只有在您了解update()
的差异并且有充分理由这样做时才会这样做。
class Circle;
class MyWidget : public QWidget {
Q_OBJECT
QBasicTimer m_timer;
QList<Circle> m_circles;
void method(Circle &);
void paintEvent(QPaintEvent * p) {
QPainter painter(this);
// WARNING: this method can be called at any time
// If you're basing animations on passage of time,
// use a QElapsedTimer to find out how much time has
// passed since the last repaint, and advance the animation
// based on that.
...
for(int i=0; i<10;i++)
{
method(m_circles[i]); //co-ordinates change
m_circles[i].paint(&painter);
}
...
}
void timerEvent(QTimerEvent * ev) {
if (ev->timerId() != m_timer.timerId()) {
QWidget::timerEvent(ev);
return;
}
update();
}
public:
MyWidget(QWidget*parent = 0) : QWidget(parent) {
...
m_timer.start(1000, this);
}
};
答案 3 :(得分:-1)
Try this.
for(int i=0; i<10;i++)//do this every second
{
method(circle[i]); //co-ordinates change
circle[i].pain( & painter);
sleep(1000);// you can also use delay(1000);
}
使用sleep()声明的函数sleep(int ms),使得程序等待指定的毫秒时间。