gpt4 book ai didi

c++ - 验证 QCheckBox stateChanged?

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:54 33 4
gpt4 key购买 nike

请原谅,因为我知道这可能是一个非常简单的问题,但我需要另一双眼睛。我的 GUI 上有一个复选框,复选框的状态(开/关)将直接改变我的中断服务例程。这看起来 super 简单,但我不能使用:

this->ui->checkBox_2->isChecked();

作为验证器,因为“对“this”的无效使用是非成员函数”除此之外,我试图只保存 stateChanged(int arg1) 的值到我可以用我的 ISR 调用的一些指针或变量,但我想我遇到了范围困难。欢迎提出任何建议!

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this->ui->pushButton_8,SIGNAL(clicked()),this,SLOT(on_pushButton_8_clicked()));
//connect(this->ui->checkBox_2,SIGNAL(clicked(bool)),this,SLOT(myInterruptRIGHT));
//connect(this->ui->checkBox_2,SIGNAL(clicked(bool)),this,SLOT(myInterruptLEFT));
// connect(on_checkBox_2_stateChanged(int arg1)(),SIGNAL(clicked(bool checked)),this,SLOT(myInterruptRIGHT));
ui->pushButton->setText("STOP");


ui->verticalSlider->setMinimum(6);
ui->verticalSlider->setMaximum(8);
}

void MainWindow::on_checkBox_2_stateChanged(int arg1)
{
QCheckBox *cb2 = new QCheckBox;
connect(cb2,SIGNAL(stateChanged(int)),this,SLOT(on_checkBox_2_stateChanged(int)));
int sensor = digitalRead(23);
//Does a bunch of stuff
}

void myInterruptRIGHT (void)
{
//if(this->ui->checkBox_2->isChecked())

if(ui->checkBox_2->isChecked())

{ //Does stuff
}
else
{ //more stuff
}
}


PI_THREAD(RightTop)
{
for(;;)
{

wiringPiISR(23,INT_EDGE_RISING,&myInterruptRIGHT);

}
}

我为草率的代码道歉,我一直在测试一堆不同的东西,但没有什么被证明是非常有效的。

最佳答案

问题 1:MainWindow::on_checkBox_2_stateChanged创建复选框并将其自身连接到复选框信号槽?确保复选框是在构造函数中的某处创建的,或者可能是在 UI 预先设计的代码部分中创建的。

问题 2:PI_THREAD似乎不是 Qt 线程用插槽来捕获信号。您仍然可以为您的嵌入式应用程序做些事情。

请注意,我当然无法测试该解决方案,但我确实在实际应用中应用了类似的技术。您可以考虑 std::atomic<T>

class MainWindow : public QMainWindow
{
public:
QAtomicInt& atomicChkBox2State() {return m_chkBox2StateAtomic;}
//// snip
private:
QAtomicInt m_chkBox2StateAtomic;
//// snip
};


void MainWindow::on_checkBox_2_stateChanged(int state)
{
m_chkBox2StateAtomic = state;
}


// where you create MainWindow you need to get that pointer somehow

static MainWindow* s_pMainWnd;
MainWindow* getMainWindow() {return s_pMainWnd;} // declare it in the .h file

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
s_pMainWnd = &w; // take an address

w.show();

return a.exec();
}

// and that ISR should read the atomic variable in case if does poll for check:

void myInterruptRIGHT (void)
{
// now poll the atomic variable reflecting the state of checkbox
if(getMainWindow()->atomicChkBox2State())

{ //Does stuff
}
else
{ //more stuff
}
}

这是针对ISR,在系统中断 vector 调用时不断轮询原子变量。如果该中断服务例程应该从复选框中获得自己的终止信号,那么我们无法在不了解您的嵌入式平台的更多信息的情况下回答这个问题“如何从‘端’而不是通过系统中断终止 ISR”。

关于c++ - 验证 QCheckBox stateChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38873355/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com