Правильный синтаксис C в Qt «connect»?

#c

#c

Вопрос:

Я изучаю, как использовать connect в Qt. У меня есть идея, как это работает при подключении виджетов в текущем объекте.

Моя проблема в том, что я не до конца понимаю синтаксис C при подключении двух объектов.

Моя текущая тестовая задача — передать item selected в list list_2 текущий объект с использованием кода C . (Я знаю, как это реализовать с помощью QtDesigner, но я хочу научиться использовать код)

 QListWidgetItem item;
connect(ui->list,
    amp;QListWidget::itemClicked(QListWidgetItem amp;item),
    ui->list_2,
    amp;QListWidget::addItem(amp;item));
 

Приведенный выше код выдает мне две ошибки, и мне нужна помощь, чтобы ОПРЕДЕЛИТЬ, что не так с моим синтаксисом C .

 /media/f/QT/Qt/QT/qtconnectivity/examples/bluetooth/CAT_BT_18112020/device.cpp:127: error: expected primary-expression before 'amp;' token
         amp;QListWidget::itemClicked(QListWidgetItem amp;item),

/media/f/QT/Qt/QT/qtconnectivity/examples/bluetooth/CAT_BT_18112020/device.cpp:129: error: cannot call member function 'void QListWidget::addItem(QListWidgetItem*)' without object
                 amp;QListWidget::addItem(amp;item));
                                        ^
 

Спасибо

Мне нравится добавлять / редактировать / уточнять сообщение.

Было бы полезно начать со знания условных обозначений / символов в этом connect коде C .

Каковы составные части [=](){...} синтаксиса «lambda» на английском языке?

 connect(action, amp;QAction::triggered, engine,
        [=]() { engine->processAction(action->text()); });
 

Возможно, помогите мне, применив аналогичный моему исходному connect коду.

Комментарии:

1. Ваши синтаксические ошибки являются базовыми ошибками C (не говоря уже о недопустимом Qt). Посмотрите здесь несколько правильных примеров: doc.qt.io/qt-5/signalsandslots.html . ПРЕДЛОЖЕНИЕ: изучите код, который выдает разработчик.

2. Вы должны научиться помещать свои части кода в блоки кода, чтобы вопрос выглядел лучше. Это поможет вам получить ответ, поскольку читателю не нужно тратить слишком много усилий

Ответ №1:

Правильный синтаксис для оператора connect должен быть

 connect(list_widget_1,
        amp;QListWidget::itemClicked,
        list_widget_2,
        QOverload<QListWidgetItem*>::of(amp;QListWidget::addItem));
 

Поскольку addItem() имеет 2 перегрузки, QOverload необходимо использовать

 QListWidget::addItem(const QString amp;label)
QListWidget::addItem(QListWidgetItem *item)
 

Но вы не хотите этого делать, поскольку в документации конкретно сказано, что:

Предупреждение: QListWidgetItem может быть добавлен в QListWidget только один раз. Добавление одного и того же QListWidgetItem несколько раз в QListWidget приведет к неопределенному поведению.

Вместо этого вы должны сделать что-то вроде этого

 connect(list_widget_1,
        amp;QListWidget::itemClicked,
        [list_widget_2](QListWidgetItem *item)
{
    list_widget_2->addItem(item->clone());
});
 

Объяснение лямбда-части:

  • Внутри квадратных скобок находится захватывающая часть. В следующем теле лямбда-выражения мне нужно использовать list_widget_2 , поэтому мне нужно его захватить.
  • Внутри круглых скобок находится место для параметров. Эта часть похожа на обычные функции. Поскольку itemClicked() передается a QListWidgetItem * , я приму его в качестве параметра для лямбда.
  • Внутри фигурных скобок находится тело лямбды. Эта часть похожа на обычные функции.

Более подробная информация о лямбде в документации

Комментарии:

1. Если вы найдете ответ полезным, пожалуйста, рассмотрите возможность голосования и отметьте его правильно.