单击按钮时,如何在 qt creator 的 main.cpp 中设置计时器以更新 GUI?

How to have a timer in main.cpp in qt creator to update the GUI when a button is clicked?

我正在和我的团队一起为学校创建一个洗衣机模拟。我有 simulation.cpp,其中我有控制 GUI 的功能,main.cpp 我只调用一个 Work() 函数,该函数应该检查用户是否单击了按钮(例如添加硬币) .这两者之间有许多 类 和接口,用于处理与模拟部分无关的应用程序逻辑。

我的问题是我希望能够在单击按钮时选中复选框。但是,在 main.cpp 之后,我无法在 return a.exec() 之后做任何事情。在此之前我也无能为力,因为这是弹出 GUI 的内容。

所以我想使用一个间隔为 1 秒的计时器,它在滴答时调用 Work() 函数。我在 simulation.cpp 中创建了这个计时器,但我无法在 main.cpp 中创建它。

我的 simulation.cpp 看起来像这样:

bool button10 = false;
Simulation::Simulation(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Simulation)
{
    ui->setupUi(this);
    timer = new QTimer(this); // create it
        connect(timer, &QTimer::timeout, this, &Simulation::TimerSlot ); // connect it

    timer->start(1000);
}

void Simulation::TimerSlot()
{
    SetCoin_10(coin10); 
    coin10++;
}
void Simulation::SetCoin_10(uint8_t nrOfCoins){
    if(nrOfCoins == 1){
        ui->checkBox_17->setChecked(1);
    }
    else if(nrOfCoins ==2){
        ui->checkBox_16->setChecked(1);
    }
    else if(nrOfCoins ==3){
        ui->checkBox_15->setChecked(1);
    }
}

uint8_t Simulation::GetBtn_10(){
    if(button10){
        button10 = false;
        return true;
    }
    else{
        return false;
    }
}

main.cpp:

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    
    simulation = new Simulation();
    
    cs = new Coins(simulation);
     ps = new ProgramSelector(simulation);
     sp = new Soap(simulation);
     dr = new Director(cs, ps, sp);

    simulation->show();
    dr->Work(); //this is what I want to execute every second (from director class)
    return a.exec();

}

我该如何做到这一点?非常感谢!

您可以“连接”到活动。 Qt 会在 exec() 进入事件循环,并在事件发生时调用连接的函数。

您已经在计时器上完成了。每当计时器触发时,您只需调用 TimerSlot()

您的问题只是变量的可访问性。现在,您无法访问“dr”以从模拟中调用“dr->Work()”class。

选项 1:

将像“dr”和“cs”这样的对象传递给模拟,要么在像new Simulation(dr, cs...)这样的构造函数中,要么通过添加 setter 函数,然后像 simulation.setCoins(cs)

选项2:

在模拟中创建对象,如“dr”和“cs”。可能是构造函数中最好的。


提示:对于这两个选项,您应该像这样创建成员变量:

private Coins coins;

这不需要 new 关键字,因为它是在堆栈而不是堆上创建的。这也意味着,您不需要在析构函数中删除硬币对象。由于您没有得到指针,因此您可以使用 . 而不是 ->.

访问函数