【问题标题】:How to pass a variable from main to signal and slot macros?如何将变量从 main 传递给信号和插槽宏?
【发布时间】:2015-02-22 06:45:07
【问题描述】:

最难为 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 应该会亮起。不幸的是,我无法将按钮从 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)层与业务层(即标准的 3 层架构模型...想想 MVC)混合在一起。否则我只会把这个按钮放在一个班级里,不用担心做这个线程。

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

【问题讨论】:

  • 我尝试做类似的事情,但无法让它发挥作用。 Qt 的语法非常烦人。我相信您可能必须发出信号,然后以某种方式将其捕获到插槽中。

标签: c++ qt


【解决方案1】:

您可以为此使用QSignalMapper

您将按钮的clicked() 信号连接到映射器的map() 插槽,然后使用映射器的setMapping 函数设置从按钮到LED 的映射。

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

【讨论】:

  • 好答案。 QObject 基本上有自己的信号映射器,但main 没有。
  • @Mat 你不是说mapped 信号,而不是槽吗?
【解决方案2】:

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

ma​​in.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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多