如何将变量从main传递到signal和slot宏
How to pass a variable from main to signal and slot macros?
为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);
在时钟类中设置样式表,就可以开始了。
相关文章:
- 调用 raise(signal) 会终止 c++ 程序
- 未调用 signal() 指定的处理程序
- C++中链表的错误"Abort signal from abort(3) (sigabrt) "
- Qt的slot(?)将冗余命名空间插入连接
- 将成员函数传递给 std::signal
- 在 C++11 中,signal.h 标头没有 kill 函数
- QTableWidget dataChanged SIGNAL
- connect(QObject*, SIGNAL(signal()), functor) 在 qt5 中未连接
- Qt单选按钮仅在实际选中按钮时调用SLOT()
- "Static polymorphism with Qt signal/slot: What is wrong?"
- 为什么此程序以"unknown signal"终止?
- QObject::connect not connecting signal to slot
- 如何将变量从main传递到signal和slot宏
- 如何从QListView的SIGNAL/SLOT传递/检索参数
- 在哪里声明从Qt SIGNAL/SLOT返回的对象
- qt 如何传递 qshortcut() 的 QkeySequence 以通过 connect(Signal,Slot)
- 在QT中使用Signal和Slot时无法接收数据
- C++ - QT - SIGNAL and SLOT understanding
- 关于SIGNAL/SLOT qt4的问题
- Qt在MainWindow对象成员中连接SIGNAL和SLOT