最难为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中的变量与信号和插槽宏连接?
答案 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);
在你的时钟课程中设置样式表,你就可以了。