如何将变量从main传递到signal和slot宏

How to pass a variable from main to signal and slot macros?

本文关键字:signal slot 变量 main      更新时间:2023-10-16

为main中的变量设置信号和插槽宏是最困难的。当变量位于类中时,这非常容易做到,但当您想在main中连接变量时,如何做到这一点?

我主要有两个单选按钮如下:

 QRadioButton *btn_ledWhite = new QRadioButton;
 QRadioButton *btn_ledBlack = new QRadioButton;

我想将这些按钮传递给一个函数,该函数设置它们的样式表。如下所示:

 btn_led->setStyleSheet("QRadioButton::indicator::unchecked{background-color:gold;}");

当我的应用程序的用户按下btn_start时,白色播放器的LED应该会亮起。不幸的是,我无法将按钮从main传递到signal和slot宏。我想要这样的东西:

 QObject::connect(btn_start, SIGNAL(clicked()), whiteClock, SLOT(updateLED(btn_ledWhite)));

然而,这是非法的qt语法。显然,不能将参数传递给封装在SLOT宏中的函数。

你可以做一些类似的事情:

Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
                 &b, SLOT(setValue(int)));

但我不能将表示(GUI)层与业务层(即标准的三层架构模型……想想MVC)混合在一起。否则,我只需要把这个按钮粘在一个类中,而不用担心制作这个线程。

有人知道如何将主变量与信号和槽宏连接起来吗?

您可以为此使用QSignalMapper

您将按钮的clicked()信号连接到映射器的map()插槽,然后使用映射器的setMapping功能将映射from按钮设置为led。

完成后,将映射器的mapped信号连接到whiteClock。您可能需要调整slot函数的签名,使其采用QWidget而不是QPushButton,但如果您只需要调用setStyleSheet,那么这并不是什么大问题。

此代码有效。您确实需要将前面提到的函数签名调整为QWidget*,而不是QRadioButton*。。。但其他一切都应该是一样的。

main.cpp

QSignalMapper * signalMapper = new QSignalMapper;
//Start game, start white's clock, turn on white's LED
QObject::connect(btn_start, SIGNAL(clicked()), whiteClock, SLOT(startClock()));
QObject::connect(signalMapper, SIGNAL(mapped(QWidget*)), whiteClock, SLOT(updateLED(QWidget*)));
QObject::connect(btn_start, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(btn_start, btn_ledWhite);

在时钟类中设置样式表,就可以开始了。