Подключить список виджетов, нажав на кнопку пользовательского виджета
Я использую QProcess для сканирования доступных устройств Bluetooth. QProcess использует команды командной строки, такие как сканирование hcitool, для проверки доступных устройств. Выходные данные анализируются с использованием регулярных выражений, и у меня есть ячейки (равные количеству отсканированных устройств) структуры данных с такими деталями, как имя устройства, канал для OPUSH, тип устройства, адрес устройства.
Для отображения всех устройств я использую QListWidget
//Display on list widget
//Send all information regarding device name, address, OPUSH channel and icon
//to child widget myBTwidget
myBTwidget *MyItem = new myBTwidget();
MyItem->BTName(DeviceName);
MyItem->BTAddress(address);
MyItem->BTChannelNo(channel);
MyItem->BTIcon(icon);
QListWidgetItem *item=new QListWidgetItem();
item->setSizeHint(QSize(720,50));
this->ui->listWidget->addItem(item);
//Add child widget myBTwidget to list widget
this->ui->listWidget->setItemWidget(item,MyItem);
Пользовательский дочерний виджет имеет 1. метку, показывающую изображение для типа устройства 2. кнопку (плоскую), отображающую имя устройства 3. метку, указывающую, доступен ли канал OPUSH для отправки файлов или нет
Нажата кнопка listwidgetitem, она соединяется с устройством Bluetooth и отправляет файлы. Я хотел бы подключить сигнал QListwidgetitem clicked() к кнопке childwidget, содержащей слот имени устройства clicked(). Таким образом, пользователь может нажать где угодно на элементе, а устройство соединится и отправит файл.
Как мне это сделать?
Список виджетов находится в родительском классе, а элемент является дочерним виджетом. Я попытался подключить сигнал щелчка qlistwidgetitem к слоту onitemclicked(). В функции onitemclicked () я пытался вызвать функцию внутри настраиваемого дочернего виджета, который реализует функцию нажатия кнопки, но, поскольку она не будет содержать таких сведений, как имя устройства, адрес, канал, она не может выполнить эту операцию.
Если бы я просто щелкнул по кнопке дочернего виджета, содержащей текст в качестве имени устройства, он содержит все детали и выполнит операцию сопряжения и отправки.
Я подумал о нескольких решениях: 1. создать глобальную структуру и сохранить в ней данные и использовать ИЛИ 2. создать таблицу в базе данных и сохранить данные при анализе загрузки дочерних виджетов и использовать эти данные для вызова функции для отправки файла
Я хотел бы знать, есть ли лучший способ сделать это? Если мне удастся получить отдельные детали listwidgetitem, отправленные в пользовательский дочерний виджет, сохраненные каким-либо образом и нажав элемент, получить все детали и вызвать функцию для сопряжения и отправки файла??
Пожалуйста, помогите мне.
Спасибо
1 ответ
Прежде всего: QListWidgetItem не имеет сигнала clicked(). (Это не сам виджет). Вы должны подключиться к QListWidget::itemClicked(QListWidgetItem*) - Как вы можете видеть, этот сигнал предоставляет вам конкретный элемент, по которому щелкнули.
Конечно, это само по себе не поможет, так как Предмет не знает отображаемых данных. Вы должны хранить информацию в самом QListWidgetItem, используя setData(), чтобы вы могли получить ее позже из Item.
Но поскольку вы, вероятно, не хотите дважды хранить ваши данные (один раз в myBTwidget и один раз в QListWidgetItem), вы можете хранить данные только в QListWidgetItem и реорганизовать свой виджет в делегат...
Посмотрите в документации для делегатов, вы найдете некоторые примеры там. (Я не уверен, если делегаты работают с QListWidget без проблем, лучше использовать QListView с QStandardItemModel/ пользовательской моделью)