我正在尝试实现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:错误:在此上下文中
我做错了什么想法???
答案 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
起始值。您还可以创建StateStart
和StateStop
状态以使其更清晰(并且能够停止动画)。
答案 2 :(得分:3)
您可以在此处找到问题的答案:How do I create a pause/wait function using Qt?。 如果您对QThread :: sleep()受到保护并且无法使用它感兴趣,答案非常简单。实现QThread :: sleep(),以便它只能在调用它的自己的线程中进行延迟。 因此,此方法可用于多线程应用程序,以延迟一个线程一段时间。要指定您想要延迟的线程,只能从该线程代码调用此方法。这就是为什么它受到保护。