Qt:Signal调用的函数的默认参数

Posted

技术标签:

【中文标题】Qt:Signal调用的函数的默认参数【英文标题】:Qt: Default Parameters for function called by Signal 【发布时间】:2016-11-14 21:24:04 【问题描述】:

当我尝试将具有一个默认参数和一个非默认参数的函数连接到 QSlider 时收到此错误:

230: error: static assertion failed: The slot requires more arguments than the signal provides.
         Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
         ^

这是否意味着连接到函数的 QWidget 不能支持默认参数?有没有办法解决这个问题?

这是我的尝试:

void MainWindow::connections() 
    connect(sliderA, &QSlider::valueChanged, this, &MainWindow::someSliderChanged);
    connect(sliderB, &QSlider::valueChanged, this, &MainWindow::someSliderChanged);


void MainWindow::someSliderChanged(int position, char state = 0) 
    QObject* sender = QObject::sender();
    if (sender == sliderA || state == 1) 
        thing1->setValue(position);
     else if (sender == sliderB || state == 2) 
        thing2->setValue(position);
    


void MainWindow::default() 
    someSliderChanged(50, 1)
    someSliderChanged(70, 2)

【问题讨论】:

我认为不可能,但您可以使用单个参数创建第二个插槽,然后调用您的原始插槽。如果你喜欢我打赌你可以将第二个插槽设为 lambda。 你也可以考虑 struct SliderConfiguration int position;字符状态; ,然后将插槽设置​​为 someSliderChanged(SliderConfiguration) 【参考方案1】:

这是否意味着连接到函数的 QWidget 不能支持默认参数?

来自信号槽的documentation:

信号的签名必须与接收槽的签名匹配。

因此我会说不,这是不可能的。

有没有办法解决这个问题?

例如,如果您的编译器支持 C++11,则可以使用 lambda 函数。 像这样的:

connect(sliderA, &QSlider::valueChanged, [this](int pos) someSliderChanged(pos); );

否则,定义一个没有额外参数的(让我说)forward slot并将其绑定到信号。

有关更多详细信息,请参阅 documentation 以了解 QtObject::connect 的重载。

【讨论】:

虽然我正在运行 C++11,并且您的 connect() 解决方案确实编译,但 someSliderChanged 无法识别信号的 sender,因此它不会更新,呈现此解决方案没有按我的需要工作。

以上是关于Qt:Signal调用的函数的默认参数的主要内容,如果未能解决你的问题,请参考以下文章

QT信号槽connect的第五个参数

关于QT中的signal 和 slot 中带参数问题

signal函数

在构造函数 QT Creator(继承类)中传递默认参数

signal()函数

使用默认参数调用异步函数作为参数检查处理同步的函数?