按钮点击

时间:2016-04-10 15:50:47

标签: c++ macos qt signals-slots

我是Qt的新手,我正在尝试运行一个循环,它将使用QPainter更新QWidget。简而言之,我试图运行一个无限循环,在按钮点击时刷新QWidget(比如说开始游戏)。然后我想在点击另一个按钮(例如结束游戏)时停止循环。我还想了解有关获得此功能的更好方法。

在我的MainWindow类中,我想启动一个包含类Game对象的线程。当调用game-> start_game()方法时,无限循环开始。我想按一下按钮开始循环。然后循环应该在点击另一个按钮“end”时退出。

//main_wid is the central widget of my MainWindow
QPushButton* btn_start = new QPushButton("start", main_wid);
QPushButton* btn_end = new QPushButton("end", main_wid);
//thread, game are private variables in my MainComponent class
thread = new QThread;
game = new Game(10);
game->moveToThread(thread);

//on btn_start click, the thread start in run_thread() method
connect(btn_start, SIGNAL(clicked(bool)), this, SLOT(run_thread()));
//on thread->start(), I call start_game() slot in the Game class which runs an infinite loop
connect(thread, SIGNAL(started()), game, SLOT(start_game()));

//here i want to connect clicked(bool) of btn_end to a method in game class 
//such that i can break the loop in start_game() method.
//.......??

我的游戏课程:

class Game : public QObject
{
Q_OBJECT
public:
Game(int n);
~Game();

public slots:
void start_game();
void end_game();

signals:
void finish_game();

private:
int num;
};

游戏类方法的定义:

Game::Game(int n)
{
    num = n;
}

void Game::start_game()
{
    int i = 0;
    while(true)
    {
    cout << "game loop started:" << i++ << endl;
    }
    //emit finish_thread();
}

 void Game::end_game()
{
    cout << "*************************end**************************" << endl;
    emit finish_game();
}

Game::~Game()
{

}

1 个答案:

答案 0 :(得分:1)

您的三角形是z=-2绘制的。由于您似乎从未设置过投影矩阵,因此它将保留为标识,OpenGL将在所有三个维度上剪切位于范围[-1,1]之外的任何内容(无论您旋转它的角度是什么,因为它将围绕theo rigin旋转,它将始终与原点保持2个单位。

当您学习OpenGL时,您应该知道,您使用的大多数GL功能都是已弃用近十年。在现代GL中,这些功能被完全删除。你的书看起来非常过时了。我只能建议学习现代OpenGL。