[英]QThread::msleep() freezes program
當用戶保存游戲時,我試圖在我的QLabel
上創建一種淡入淡出效果。
因此,我認為使用QThread
非常適合這項工作,但唯一的問題是QThread::msleep();
凍結程序。
在此之前,我已經多次使用這種技術來減慢循環速度,但是現在,它決定凍結程序直到循環結束。
有人對這里發生的事情有任何想法嗎?
我刪除了所有無關的東西,因為該程序很大。
#ifndef SAVED_H
#define SAVED_H
#include <QThread>
class Saved : public QThread
{
Q_OBJECT
public:
explicit Saved(QObject *parent = 0);
void run();
signals:
void reduceVisibility(unsigned short);
public slots:
};
#endif // SAVED_H
#include "saved.h"
Saved::Saved(QObject *parent) :
QThread(parent)
{
}
void Saved::run(){
unsigned short alpha = 250;
for(unsigned short i = 0; i <= 5; i++){
emit reduceVisibility(alpha);
alpha -= 50;
QThread::msleep(250);
}
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
// QThread
#include "saved.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Saved *saving;
private slots:
public slots:
void animateSave(unsigned short);
private:
Ui::MainWindow *ui;
};
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QFile>
#include <QTextStream>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// QThread
saving = new Saved(this);
connect(saving, SIGNAL(reduceVisibility(unsigned short)), this, SLOT(animateSave(unsigned short)));
}
MainWindow::~MainWindow()
{
delete ui;
}
// Buttons
void MainWindow::on_Btn_Save_clicked(){
QFile saveFile("save.txt");
saveFile.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&saveFile);
out << user.getUsername() + "\n" + user.getLevel();
saveFile.close();
saving->run();
saving->quit();
}
// Slots
void MainWindow::animateSave(unsigned short Visibility){
QString visible = QString::number(Visibility);
ui->Lbl_Saved->setStyleSheet("color:rgb(0,255,255, " + visible + ");");
}
您也可以查找QPropertyAnimation
的文檔,並將其掛在QWidget::windowOpacity
。 這可能是最適合您的問題的東西。
例如:
void MyWidget::buttonClicked() // SLOT when button is clicked
{
QPropertyAnimation* anim = new QPropertyAnimation(ui->Lbl_Saved, "windowOpacity"); // new animation, hooked on the labels window opacity
anim->setDuration(2500); // use 2.5 seconds for disapearing
anim->setStartValue(1.0f); // from full visible
anim->setEndValue(0.0f); // to invisible
connect(anim, SIGNAL(finished()), anim, SLOT(deleteLater())); // delete object when animation done
anim->start();
}
有人對這里發生的事情有任何想法嗎?
這是有意的(請參閱QThread:QObject) 。 接收器MainWindow
在另一個線程中。 由於默認連接為AutoConnection
,因此Qt將使用QueuedConnection
並在與MainWindow
對象相同的線程中運行animateSave
插槽。
但是,您根本不應該使用QThread
。 您不想同時做某事,而是希望在給定時間(或之后)發生某事。 QTimer
是您想要的。
MainWindow::MainWindow(QWidget *parent)
{
/* ... */
myTimer = new QTimer(this);
connect(myTimer, SIGNAL(timeout(), this, SLOT(decreaseAlphaOrStop()));
}
void MainWindow::on_Btn_Save_clicked(){
/* .. snip .. */
alpha = 250;
myTimer->start(250);
}
// new slot
void MainWindow::decreaseAlphaOrStop(){
alpha -= 50;
if( alpha < 0){
alpha = 0;
myTimer->stop();
}
animateSave(alpha);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.