Qt如何在循环中更新GUI

时间:2017-04-06 08:41:00

标签: qt

我需要更新屏幕以显示按钮的移动方式。 这是我的代码:

void mouseReleaseEvent(QMouseEvent *event){
    double b=(button->x()*event->y())/(button->x()-1);
    double k=(button->y()-b)/button->x();
    int time=0;
    fnl=false;
    if(event->button()==Qt::LeftButton)
    {
        while(!fnl)
        {
            int mX=button->x()-1;
            int mY=k*(button->x()-1)+b;
            button->setText(QString::number(b));
            button->move(mX,mY);
            QThread::sleep(1);
            //here I need to update screen and show button
        }

    }
}

但它没有更新GUI。它只是在循环内部播放。

2 个答案:

答案 0 :(得分:1)

永远不要在GUI线程中使用QThread::sleep() ,它会阻止GUI线程做任何事情。相反,您可以使用QTimer安排某些内容在以后运行。此外,您的插槽/功能应尽可能短且优化,以便将控制权返回给事件循环并能够处理other events that may happen

您可能希望查看类似问题的this question。 这里可以使用相同的技术来解决问题,方法是将while循环替换为一个插槽和一个QTimer,其间隔设置为0但Qt可以使用the animation framework 完成所有工作,以下是点击时移动按钮的示例:

#include <QtWidgets>

int main(int argc, char* argv[]){
    QApplication a(argc, argv);
    //create and show button
    QPushButton button("Animated Button");
    button.move(QPoint(100, 100));
    button.show();
    //create property animator object that works on the position of the button
    QPropertyAnimation animation(&button, "pos");
    //set duration for the animation process to 500ms
    animation.setDuration(500);

    //when the button is clicked. . .
    QObject::connect(&button, &QPushButton::clicked, [&]{
        //set the starting point of the animation to the current position
        animation.setStartValue(button.pos());
        //set the ending point to (250, 250)
        animation.setEndValue(QPoint(250, 250));
        //start animation
        animation.start();
    });

    return a.exec();
}

Qt还提供了使用动画框架的many examples。 。

答案 1 :(得分:0)

计时器是最佳选择。如果你想使用蛮力,你可以打电话

qApp->processEvents();
循环中的

。丑陋但完成工作。