Search code examples
c++qtsignals-slotsqwidgetdefault-parameters

Qt: Default Parameters for function called by Signal


I receive this error when I try to connect a function with one default parameter and one non-default parameter to a 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),
         ^

Does this mean a QWidget connected to a function cannot support default parameters? Is there a way to fix this?

Here is what I attempted:

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)
}

Solution

  • Does this mean a QWidget connected to a function cannot support default parameters?

    From the documentation of signal and slots:

    The signature of a signal must match the signature of the receiving slot.

    Therefore I would say that no, it is not possible.

    Is there a way to fix this?

    As an example, if you compiler support C++11, you can use a lambda function.
    Something like this:

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

    Otherwise, define a (let me say) forward slot that has not the extra parameter and bind it to the signal.

    See the documentation for the overloads of QtObject::connect for further details.