C++ Qt/C+中睡眠功能的替代物+;

C++ Qt/C+中睡眠功能的替代物+;,c++,qt,qtcore,qt-signals,qtimer,C++,Qt,Qtcore,Qt Signals,Qtimer,因此,我正在编写一个程序,显示一个单词的每个字母1秒,字母之间的间隔为1秒。(这是一个一年级的拼写练习)。我目前正在使用睡眠功能“暂停”程序1秒,然后再“更新”。之后,它会显示该单词一秒钟,然后将其删除。我在睡眠功能之前重新绘制,否则它似乎没有及时更新 以下是基本功能: QString word = "apple"; QThread thread; for(int i = 0; i < word.size(); i++) { ui->label1->setText(w

因此,我正在编写一个程序,显示一个单词的每个字母1秒,字母之间的间隔为1秒。(这是一个一年级的拼写练习)。我目前正在使用睡眠功能“暂停”程序1秒,然后再“更新”。之后,它会显示该单词一秒钟,然后将其删除。我在睡眠功能之前重新绘制,否则它似乎没有及时更新

以下是基本功能:

QString word = "apple";
QThread thread;

for(int i = 0; i < word.size(); i++)
{
    ui->label1->setText(word[i]);
    ui->label1->repaint();
    thread.sleep(1);
    ui->label1->setText("");
    thread.sleep(1);
}

ui->label1->setText(word);
ui->label1->repaint();
thread.sleep(1);
ui->label1->setText("");
QString word=“苹果”;
QThread线程;
for(int i=0;ilabel1->setText(word[i]);
ui->label1->repaint();
睡眠(1);
ui->label1->setText(“”);
睡眠(1);
}
ui->label1->setText(word);
ui->label1->repaint();
睡眠(1);
ui->label1->setText(“”);
这可以正常工作,除了程序停止响应(即使我可以看到正确的输出仍在显示)直到整个函数完成执行,然后再正常工作。有没有其他方法可以不用睡眠来实现这个目标?我对Qt很陌生

我所做的更新。我创建了一个新类来处理计时器,但它似乎并没有实际连接信号和插槽。以下是.h文件:

#ifndef TIMERDISPLAY_H
#define TIMERDISPLAY_H

#include <QTimer>
#include <QObject>

class TimerDisplay:public QObject
{
    Q_OBJECT

public:
    TimerDisplay();

public slots:
    void expired();

private:
    QTimer timer;
};

#endif // TIMERDISPLAY_H
\ifndef TIMERDISPLAY\u H
#定义TIMERDISPLAY\u H
#包括
#包括
类TimerDisplay:公共QObject
{
Q_对象
公众:
TimerDisplay();
公众时段:
失效();
私人:
定时器;
};
#endif//TIMERDISPLAY\u H
和.cpp文件:

#include "timerdisplay.h"
#include <QDebug>

TimerDisplay::TimerDisplay()
{
    connect(&timer, SIGNAL(timeout()), this, SLOT(expired()));
    timer.setSingleShot(false);
    timer.setInterval(1000);
    timer.start();
}

void TimerDisplay::expired()
{
    qDebug()<<"timer expired";
}
#包括“timerdisplay.h”
#包括
TimerDisplay::TimerDisplay()
{
连接(&计时器,信号(超时()),此,插槽(过期());
定时器设置单脉冲(假);
定时器设置间隔(1000);
timer.start();
}
void TimerDisplay::expired()
{
qDebug()如果需要更高的精度,请使用或

main.cpp 构建并运行 输出
发生这种情况是因为您正在阻塞线程。在大多数情况下,您对使用事件循环感兴趣

您可以使用计时器并在插槽函数中增加计数器。每个
QObject
都支持计时器。您可以使用
int-QObject::startTimer(int-interval)
启动它,它将调用
virtual void-timerEvent(QTimerEvent*事件)
每隔
间隔
毫秒(这是一个虚拟方法-重新实现它)

您还可以使用
QTimer
和连接
QTimer::timeout()
信号来完成相同的任务

在计时器处理程序内部,递增计数器并打印字符


把你的手放在有限状态机概念上是个好主意。FSM是解决类似问题的一个很好的工具。事实上,使用计时器回调可以创建一个状态机,但非常简单。

我仍然不知道问题是什么,但我找到了一个临时解决方案。在我的程序中,我包含了一个类(例如class1)在mainwindow.cpp中,我从该类中包括了timer类。我通过删除timer类并将所有这些函数添加到class1中解决了问题。对我来说没有意义,但它可以工作。

是的,重复QTimer。寻找一些提示。我查看了该问题并更新了代码,但connect函数似乎无法连接信号和插槽。(我发布了代码)。很抱歉花了这么长时间,我们的电源断了。我仍然不知道问题是什么,但我找到了一个临时解决方案。在我的程序中,我包括一个类(例如class1)在我的mainwindow.cpp中,我从该类中包括了timer类。我通过组合class1和timer类解决了这个问题。对我来说没有意义,但它是有效的。我看了你的建议,更新了我的代码,但connect函数似乎没有连接信号和插槽。(我发布了代码)。很抱歉用了这么长时间,我们的电源断了。@Ipapp我试过了,但它只在main.cpp中使用。在这个程序中,我不能在main.cpp中使用它,我在按下按钮时使用它。@Ravenblack:很抱歉,但您没有给我们任何证据说明它为什么不起作用。1)重新运行qmake 2)检查connect的返回值3)检查信号是否正确完全发出了。@Ipapp,我照你说的做了:
qDebug()@Ravenblack:恐怕无法重现您的问题。请确保您自己提供了一个main.cpp来重现该问题。我确信该问题存在于您尚未向我们展示的地方。也许您需要再次运行qmake以确保MOC正确处理新类。MOC帮助生成信号和插槽工作。此外,您应该检查connect()的返回代码。
#include <QTimer>
#include <QCoreApplication>
#include <QString>
#include <QTextStream>
#include <QDebug>

int main(int argc, char **argv)
{
    QCoreApplication application(argc, argv);
    QTimer timer;
    QTextStream textStream(stdout);
    QString word = "apple";
    int i = 0;
    QObject::connect(&timer, &QTimer::timeout, [&textStream, word, &i] () {
        if (i < word.size()) {
            textStream << word.at(i) << flush;
            ++i;
        }
    });
    timer.start(1000);
    return application.exec();
}
TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp
qmake && make && ./main
apple