Можно ли запрограммировать функцию в Qt SLOT() для QWidget или следует использовать QSignalMapper?

В моем приложении Qt я динамически создаю «Вопросы» в QVBoxLayouts для «Анкеты». Существует 3 типа вопросов: логические, текстовые и радио.

Когда пользователь «добавляет вопрос» в анкету, ему предоставляется QComboBox. Когда индекс/текст этого QComboBox редактируется, я хочу воздействовать на испускаемый СИГНАЛ.

Я хотел бы иметь что-то вроде Java (из старого проекта Android):

button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            //Code to run...
        }
    });

Возможно ли иметь то же самое в Qt/С++, например:

connect(qvectorOfComboBoxes.at(qvectorOfComboBoxes.end()), SIGNAL(currentTextChanged(QString)),
            this, SLOT(
                    void comboBoxTextChanged(QString newComboxBoxText)
                    {
                        //This doesn't work
                    } )) ;

Из другого сообщения здесь я понял, что идеальный подход - это QSignalMapper, но надеялся выполнить задачу аналогично описанному выше.

Обычно я нахожу свои ответы либо здесь, либо в соответствующем поиске Google (вероятно, я ищу не ту вещь, так как я не знаю названия для этого), и поэтому надеялся, что кто-то здесь может дать мне согласие или нет. Спасибо


person nldn    schedule 03.07.2013    source источник


Ответы (1)


В Qt5 и с помощью компилятора с поддержкой C++11 вы можете использовать лямбды как слоты, как объяснено здесь:

connect(sender, SIGNAL(signal(QString)), [](QString newComboxBoxText) {
    // add your code here
});

В противном случае вы можете использовать sender() для запроса QObject*, отправившего сигнал, если вам достаточно информации. Чтобы преобразовать его в QComboBox*, используйте qobject_cast<QComboBox*> и Q_ASSERT, чтобы оно не было нулевым. (Вы не можете получить ошибку времени компиляции, связанную с каким-то другим типом.)

person leemes    schedule 03.07.2013
comment
Спасибо за ответ и правильную терминологию! Я как раз собираюсь проверить это, я отмечу это как ответ через мгновение. - person nldn; 03.07.2013