2

最近、単純なゲームのプロジェクトに取り組んでいます。メイン関数 (ファイル main.cpp) に次のコードを記述しました。

    ending_note = "Draw.";
    End_Page end(ending_note, a);
    end.show();
    (*a).exec();
    if(end.flag == 1)
    {
        return 1;
    } //end if

ここで、a は Qapplication オブジェクトです。クラス End_Page は次のように定義されます (ファイル end_page.cpp):

End_Page::End_Page(string _winner, QApplication* _a, QWidget *parent):QWidget(parent){

a = _a;
this->setFixedSize(900, 675);
this->move(350, 50);
flag = 0;

//------------------- background label
background = new QLabel(this);
QMovie* movie2 = new QMovie("..\\project\\Data\\pic\\7.jpeg");
movie2->setScaledSize(QSize(this->width(), 600));
background->setMovie(movie2);
background->setGeometry(0, 0, this->width(), 600);
movie2->start();

//-------------------- set label
QString s;
label = new QLabel(s.fromStdString(_winner), this);
label->setStyleSheet("QLabel { color : rgb(200, 0, 30); qproperty-alignment: AlignCenter; }");
QFont f( "MV Boli", 32, QFont::Bold);
label->setFont(f);
label->setGeometry(0,this->height() - 400, this->width(), 160);

question = new QLabel("Do you want to play again?\n", this);
question->setStyleSheet("QLabel { color : black;}");
question->setGeometry(375, 610, 200, 30);

accept = new QPushButton("Yes", this);
accept->setGeometry(300, 630, 80, 40);
decline = new QPushButton("No", this);
decline->setGeometry(500, 630, 80, 40);

//-------------------- connect
connect(this,SIGNAL(closeSignal()), this, SLOT(closeProgram()));
connect(decline, SIGNAL(clicked()), this, SLOT(closeProgram()));
connect(accept, SIGNAL(clicked()), this, SLOT(restartProgram()));

}

End_Page::~End_Page(){}

void End_Page::closeEvent(QCloseEvent* event){
emit closeSignal();
event->accept();

}

void End_Page::EndGame(){
a->exit();

}

void End_Page::closeProgram(){
exit(0);

}

void End_Page::restartProgram(){
flag = 1;
a->exit();    

}

私の問題は、プログラムがステートメント (*a).exec(); を実行した後、ユーザーが [はい] というラベルの付いたプッシュ ボタンをクリックすると、プログラムは関数 restartProgram を最後まで実行しますが、その後は続行されないことです。関数 main に戻ります (つまり、そこで動かなくなります)。どうすればこの問題を解決できますか?

4

1 に答える 1

3

quit()orを静的クラス メンバーとして呼び出してみてください(周りexit()を渡す必要はありません)。QApplication

Qt を使用する GUI アプリケーションの場合、アプリケーションが常に 0、1、2、またはそれ以上のウィンドウを持っているかどうかに関係なく、正確に 1 つの QApplication オブジェクトがあります。非 GUI Qt アプリケーションの場合は、QtGui ライブラリに依存しないため、代わりに QCoreApplication を使用してください。QApplication オブジェクトには、グローバル qApp ポインターに相当するポインターを返す instance() 関数を介してアクセスできます。

void End_Page::restartProgram(){
    flag = 1;
    QApplication::quit();  
}

しかし、アプリケーションの主な問題は、あなたがエミットcloseSignal()してcloseEvent()いて、それに接続されているスロットがexit(0);システムコールを呼び出すことです。これは完全に不要であり、現在のプロセスを「強制終了」します。

完全に機能する例を次に示します。

#include <QApplication>
#include <qtimer>
#include <iostream>

/* Move this into h file and moc it! */
class Window:public QObject
{
    Q_OBJECT
public slots:
    void closeApp(){ QApplication::quit(); flag = 500; }
public:
    int flag;
};



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Window win;
    QTimer::singleShot(5000, &win, SLOT(closeApp()));
    a.exec();

    std::cout << "Flag: " << win.flag << std::endl;

    return 0;
}

編集

なぜあなたはこれをやっている:

if(end.flag == 1) // flag is set to 1 in restartProgram slot
{
    return 1; 
} //end if

これによりmain()関数が終了し、プログラムは再起動しません。

于 2013-02-07T18:58:58.267 に答える