Java QT-Jambi-实时更新QLCDNumber

Java QT-Jambi-实时更新QLCDNumber,java,qt,qt-jambi,Java,Qt,Qt Jambi,在我的大学里,我们正在使用接口,使用QtJambi(Java)和Eclipse集成。 我想改进我的电梯界面设计 主要的问题是我想用楼层实时更新QLCDNumber。 我要做的是模拟电梯工作,在两层楼之间做一个线程。sleep(1000),这样,我的QLCDNumber就会显示一个动画,上面写着“1…2…3…4”。问题是QLCDNAMER只显示1和4,没有动画 例如(续),我编写的代码如下: private void simulate(int floor){ while(actualFlo

在我的大学里,我们正在使用接口,使用QtJambi(Java)和Eclipse集成。 我想改进我的电梯界面设计

主要的问题是我想用楼层实时更新QLCDNumber。 我要做的是模拟电梯工作,在两层楼之间做一个线程。sleep(1000),这样,我的QLCDNumber就会显示一个动画,上面写着“1…2…3…4”。问题是QLCDNAMER只显示1和4,没有动画

例如(续),我编写的代码如下:

private void simulate(int floor){
    while(actualFloor < floor){
        try{
           Thread.sleep(1000);
        }catch(InterruptedException e){};
    actualFloor++;
    ui.LCDfloor.display(actualFloor);   
    }
}
private void模拟(内部楼层){
而(实际楼层<楼层){
试一试{
睡眠(1000);
}catch(InterruptedException e){};
实际地板++;
ui.LCDfloor.display(实际楼层);
}
}
为什么这个代码只显示第一层和最后一层? 对不起,如果你不明白我想要什么,我的英语每天都在进步:)

先谢谢你


*请注意,LCDFloor是qlcdnumberwidget的名称。看起来您有两个问题:

  • (我假设)您正在GUI线程上调用
    Thread.sleep()
    。换句话说,当您调用simulate时,您在与其他gui操作相同的线程上执行此操作。这会导致整个gui暂停

  • 您从未给Qt机会实际更新UI。当您调用
    ui.LCDfloor.display(actualFloor)
    时,绘制事件将排队,以便可以更新ui,但不是给ui实际执行绘制事件的机会,而是继续执行循环,以防止ui在模拟完成之前被更新

  • 您有两个基本修复:

  • 别睡觉,这是个糟糕的设计。相反,使用定时器和信号来模拟变化
  • 强制使用来处理事件

  • 还要记住,您不能从非GUI线程更新GUI元素。因为这是家庭作业,我将把其余的留给你:)。

    看起来你有两个问题:

  • (我假设)您正在GUI线程上调用
    Thread.sleep()
    。换句话说,当您调用simulate时,您在与其他gui操作相同的线程上执行此操作。这会导致整个gui暂停

  • 您从未给Qt机会实际更新UI。当您调用
    ui.LCDfloor.display(actualFloor)
    时,绘制事件将排队,以便可以更新ui,但不是给ui实际执行绘制事件的机会,而是继续执行循环,以防止ui在模拟完成之前被更新

  • 您有两个基本修复:

  • 别睡觉,这是个糟糕的设计。相反,使用定时器和信号来模拟变化
  • 强制使用来处理事件

  • 还要记住,您不能从非GUI线程更新GUI元素。由于这是作业,我将把其余的留给您:)。

    如果您使用的是Qt>=4.6,您几乎可以完全模拟电梯,在
    QLCDNumber
    值属性上仅使用
    QPropertyAnimation
    。如果您使用的是Qt>=4.6,您几乎可以使用
    QLCDNumber
    值属性上的
    QPropertyAnimation
    完全模拟电梯。谢谢您的回答。我会努力的。我将学习信号和计时器。我完全理解我的程序中发生了什么。是的,这在GUI线程上:谢谢你的回答。我会努力的。我将学习信号和计时器。我完全理解我的程序中发生了什么。是的,这在GUI线程上:P