我需要更新屏幕以显示按钮的移动方式。 这是我的代码:
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。它只是在循环内部播放。
答案 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();
循环中的。丑陋但完成工作。