使用QThread显示构建问题的时间延迟

时间:2014-12-15 05:20:49

标签: c++ qt qt4 qthread

我正在尝试实现QT Qthread的休眠功能,所以我在头文件中将其声明为 -

namespace Ui {
    class MainWindow;
}
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    static void sleep(unsigned long secs){QThread::sleep(secs);}
protected:
    void changeEvent(QEvent *e);
private:
    Ui::MainWindow *ui;
private slots:
    void on_pushButton_clicked();
};

在我的源代码中,我正在做的是连接到数据库后,我想要一个标签来改变背景颜色(有点像发光效果),所以我试着从里面调用sleep函数(true)循环。

while(db.open())
{
    MainWindow::sleep(13);

    qDebug()<<"Success ";
    ui->glow_label->setStyleSheet("QLabel {background-color: rgb(0, 255, 0);}");

    MainWindow::sleep(5);
    ui->glow_label->setStyleSheet("QLabel {background-color: rgb(0, 85, 255);}");
}

但它在构建时显示错误 - &gt;

/usr/local/Trolltech/Qt-4.8.4/include/QtCore/qthread.h:115:错误:'static void QThread :: sleep(long unsigned int)'受保护 /home/aj/MY_QT_WORK/timer_test/mainwindow.h:22:错误:在此上下文中

我做错了什么想法???

3 个答案:

答案 0 :(得分:6)

在主线程中使用sleep()是个坏主意,因为它会阻塞所有GUI线程。 Qt测试库对于生产而言太重了。因此,请尝试仅使用QTimer或尝试类似:

void sleep(qint64 msec)
{
    QEventLoop loop;
    QTimer::singleShot(msec, &loop, SLOT(quit()));
    loop.exec();
}

答案 1 :(得分:4)

切勿在GUI线程中使用while(true)或类似内容。摆脱使用任何类型的睡眠功能的整个想法,并使用状态计时器来创建你的发光动画。

enum GlowState{StateGreen, StateBlue}; // declare an enum somewhere in your class header
GlowState _animState; // declare a private member variable somewhere in your header

void MyClass::animateLabel() // create a slot in your class
{
    switch(_animState)
    {
    case StateGreen:
        myLabel->setStyleSheet("QLabel {background-color: rgb(0, 255, 0);}");
        _animState = StateBlue;
        QTimer::singleShot(5, this, SLOT(animateLabel()));
        break;
    case StateBlue:
        myLabel->setStyleSheet("QLabel {background-color: rgb(0, 0, 255);}");
        _animState = StateGreen;
        QTimer::singleShot(13, this, SLOT(animateLabel()));
        break;
    }
}

在某处调用animateLabel广告位以启动动画。在调用之前设置_animState起始值。您还可以创建StateStartStateStop状态以使其更清晰(并且能够停止动画)。

答案 2 :(得分:3)

您可以在此处找到问题的答案:How do I create a pause/wait function using Qt?。 如果您对QThread :: sleep()受到保护并且无法使用它感兴趣,答案非常简单。实现QThread :: sleep(),以便它只能在调用它的自己的线程中进行延迟。 因此,此方法可用于多线程应用程序,以延迟一个线程一段时间。要指定您想要延迟的线程,只能从该线程代码调用此方法。这就是为什么它受到保护。