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

时间:2015-02-22 06:45:07

标签: c++ qt

最难为main中的变量设置信号和插槽宏。当变量位于类中时,这非常容易,但是如果要在main中连接变量,如何执行此操作?

我在main中有两个单选按钮,如下所示:

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

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

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

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

 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)层与业务层(即标准3层架构模型......想想MVC)混合在一起。另外,我会在课堂上坚持使用这个按钮而不用担心这个帖子。

有没有人知道如何将main中的变量与信号和插槽宏连接?

2 个答案:

答案 0 :(得分:3)

您可以使用QSignalMapper

您将按钮的clicked()信号连接到地图工具的map()插槽,然后使用地图工具setMapping功能设置从按钮到LED的映射。

完成后,将映射器的mapped信号连接到whiteClock。您可能需要调整插槽功能的签名才能使用QWidget而不是QPushButton,但如果只需要调用setStyleSheet,那么这不是问题。

答案 1 :(得分:1)

此代码有效。你需要调整功能签名,如前面提到的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);

在你的时钟课程中设置样式表,你就可以了。