QLabel在调用时没有响应`setText()`

时间:2014-07-28 22:53:15

标签: c++ qt

我正在使用QT IDE为我的(曾经工作过的)命令行自动点击器制作一个更好看的版本。

请注意,点击仍然效果很好......功能不会受到影响。

但是,当“更新”表单本身的文本字段时会出现问题。

在我的代码中,您可以看到按下“Q”按钮,结束循环。此时,文本字段将更新(因为它们应该在循环期间连续)。我真的不确定为什么他们没有更新,直到我点击'Q'。是否有任何理由不应该像我认为的那样工作,或者有办法解决它?

感谢。请参阅下面的代码。请注意,我只会包含我认为必要的部分。根据要求,我可以发布更多代码。

CODE.cpp

bool running = 1;
float x = 1500;
float interval;
int breakCounter = 0;
float breakSeconds = 0;
int clicks = 0;

Sleep (3000);

while (running == 1)
{
    float breakChance = (rand()%650+1);
    if (breakChance == 100){
        breakCounter++;

        float breakTime = (rand()%180+1);
        breakTime = (breakTime + 60) * 1000;
        breakSeconds = breakSeconds + breakTime/1000;

        QString a = QString::number(breakCounter);
        QString b = QString::number(breakSeconds/60);
        QString c = QString::number(breakTime/1000);

        ui->label_6->setText(a);
        ui->label_7->setText(b + " mins");
        ui->label_8->setText(c);
        ui->label_9->setText("N/A");
        Sleep (breakTime);
    } else {
        float variance = (rand()%500+1);
        int flip = (rand()%2+1);
        if (flip == 1){
            interval = x + variance;
        } else {
            interval = x - variance;
        }

        QString a = QString::number(breakCounter);
        QString b = QString::number(breakSeconds/60);
        QString d = QString::number(interval);

        ui->label_6->setText(a);
        ui->label_7->setText(b + " mins");
        ui->label_8->setText("N/A");
        ui->label_9->setText(d);

        Sleep (interval);

        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        Sleep (100);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

        clicks++;
        if (GetAsyncKeyState( 'Q' ))
        {
            running = 0;
        }
    }

}

CODE.ui

<item>
 <layout class="QHBoxLayout" name="horizontalLayout_3">
  <item>
   <widget class="QLabel" name="label_4">
    <property name="text">
     <string>Current break timer:</string>
    </property>
   </widget>
  </item>
  <item>
   <widget class="QLabel" name="label_8">
    <property name="text">
     <string>N/A</string>
    </property>
   </widget>
  </item>
 </layout>
</item>
<item>
 <layout class="QHBoxLayout" name="horizontalLayout_4">
  <item>
   <widget class="QLabel" name="label_5">
    <property name="text">
     <string>Next click time:</string>
    </property>
   </widget>
  </item>
  <item>
   <widget class="QLabel" name="label_9">
    <property name="text">
     <string>N/A</string>
    </property>
   </widget>
  </item>
 </layout>
</item>

1 个答案:

答案 0 :(得分:2)

当应用程序消息泵有机会运行时,会发生Qt的绘制消息。你在这里看到的是一个循环,它将你的代码保存在堆栈中,并且不会将控制权交还给消息泵。

如果你想要延迟......这样做的方法是使用QTimer。说出你的代码需要多长时间,直到你的代码下次运行,退出你的代码,并让消息泵在时间流逝时有机会运行。