Не соединяется сигнал и слот

159
13 января 2019, 15:00

У класса QComboBox есть сигнал, и 2 перегрузки:

void currentIndexChanged(int index);
void currentIndexChanged(const QString &);

При попытке соединить это дело со слотом класса:

public slots:
    ...
    void audioInputSelected(int index);

Получаю ошибку

ошибка: no matching function for call to 'MainWindow::connect(QComboBox*&, <unresolved overloaded function type>, MainWindow*, void (MainWindow::*)(int))'
connect(ui->inputDevices, &QComboBox::currentIndexChanged, this, &MainWindow::audioInputSelected);
                                                                                                   ^

Соединяю так:

connect(ui->inputDevices, &QComboBox::currentIndexChanged, this, &MainWindow::audioInputSelected);

Почему так происходит и как это поправить?

При этом, если использовать старый вариант соединения сигналов и слотов из Qt4

connect(ui->inputDevices, SIGNAL(currentIndexChanged(int)), this, SLOT(audioInputSelected(int)));

то все успешно работает.

Answer 1

Новый синтаксис соединения не умеет (сам) в перегруженные сигналы/слоты. Для того, чтобы соединиться в такой ситуации, надо воспользоваться явным приведением типа (из wiki qt - https://wiki.qt.io/New_Signal_Slot_Syntax#Overload):

connect(mySpinBox, SIGNAL(valueChanged(int)), mySlider, SLOT(setValue(int));

cannot be simply converted to:

connect(
    mySpinBox, &QSpinBox::valueChanged,
    mySlider, &QSlider::setValue
)`

...because QSpinBox has two signals named valueChanged() with different arguments. Instead, the new code needs to be:

connect(
     mySpinBox, static_cast<void (QSpinBox::*)(int)> 
     (&QSpinBox::valueChanged),
     mySlider, &QSlider::setValue
);

Или же воспользоваться qOverload, сокращающим этот код -

connect(mySpinBox, qOverload<int>(&QSpinBox::valueChanged),
    mySlider, &QSlider::setValue);

http://doc.qt.io/qt-5/qtglobal.html#qOverload

READ ALSO
Как при профилировании в gprof получить файл gmon.out когда корректное завершение программы невозможно?

Как при профилировании в gprof получить файл gmon.out когда корректное завершение программы невозможно?

Осваиваю gprofУ меня есть многопоточное приложение, которое необходимо оптимизировать

157
directory_iterator сортировка

directory_iterator сортировка

согласно https://encppreference

143
Асинхронная запись в сокет. MSVC. Exception: &ldquo;cannot dereference string iterator&hellip;&rdquo;

Асинхронная запись в сокет. MSVC. Exception: “cannot dereference string iterator…”

Для сетевой части используется boost asioНа Windows(MSVC) выскакивает exception: "

164
Как остановить на время программу? [закрыт]

Как остановить на время программу? [закрыт]

как на время остановить программу на c++?

143