#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()
передается aQListWidgetItem *
, я приму его в качестве параметра для лямбда. - Внутри фигурных скобок находится тело лямбды. Эта часть похожа на обычные функции.
Более подробная информация о лямбде в документации
Комментарии:
1. Если вы найдете ответ полезным, пожалуйста, рассмотрите возможность голосования и отметьте его правильно.