1

QLabelユーザーがゲームを保存するときに、私の 1 つにフェード効果を作成しようとしています。

だから、私はを使うのQThreadが仕事にぴったりだと思ったが、唯一の問題はQThread::msleep();プログラムがフリーズすることだ.

ループを遅くするためにこの手法を何度も使用しましたが、ループが終了するまでプログラムをフリーズすることにしました。

ここで何が起こっているかについて誰か考えがありますか?

このプログラムは巨大なので、関係のないものはすべて削除しました。

保存された.h

#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

保存された.cpp

#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);
    }
}

メインウィンドウ.h

#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;
};

main.cpp

#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 + ");");
}
4

2 に答える 2

2

ここで何が起こっているかについて誰か考えがありますか?

これは意図されたものです(QThread: QObject を参照)。受信者MainWindowは別のスレッドにあります。デフォルトの接続はであるためAutoConnection、Qt は を使用し、オブジェクトと同じスレッドでQueuedConnectionスロットを実行します。animateSaveMainWindow

ただし、絶対に使用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);
}
于 2013-10-22T05:50:04.730 に答える