单击按钮时,如何在 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
关键字,因为它是在堆栈而不是堆上创建的。这也意味着,您不需要在析构函数中删除硬币对象。由于您没有得到指针,因此您可以使用 .
而不是 ->
.
访问函数
我正在和我的团队一起为学校创建一个洗衣机模拟。我有 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
关键字,因为它是在堆栈而不是堆上创建的。这也意味着,您不需要在析构函数中删除硬币对象。由于您没有得到指针,因此您可以使用 .
而不是 ->
.