如何在 qt creator 的 main.cpp 中有一个计时器,以便在单击按钮时更新 GUI?

Posted

技术标签:

【中文标题】如何在 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? 【发布时间】:2020-11-22 11:38:47 【问题描述】:

我正在与我的团队一起为学校创建洗衣机模拟。我有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();


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

【问题讨论】:

【参考方案1】:

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

你已经在你的计时器上这样做了。您只需在计时器触发时调用TimerSlot()

您的问题只是变量的可访问性。目前,您无法在模拟类中访问“dr”来调用“dr->Work()”。

选项1:

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

选项2:

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


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

private Coins coins;

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

【讨论】:

以上是关于如何在 qt creator 的 main.cpp 中有一个计时器,以便在单击按钮时更新 GUI?的主要内容,如果未能解决你的问题,请参考以下文章

Qt Creator LNK2019:使用 OpenCV 无法解析的外部符号

QT-第一个程序 Hello QT , 以及QT creator介绍

Qt Creator在新项目中显示错误,但代码可以正常编译

Qt Creator 在新项目中显示错误,但代码编译正常

在纯 C++ 项目中跳过 Qt Creator Linux 断点

Qt Creator/Linux:为动态库设置编译器/链接器选项 -ldl