Как реагировать на нажатия на элементы списка в представлении списка в qml, C ++ qt, в Blackberry 10 Cascades

Я пытаюсь выяснить, как можно нажать на элемент в списке в Blackberry. Я использую QML, C ++, QT и Blackberry 10 Cascades. Я реализовал представление списка, а затем попытался сделать так, чтобы вы могли щелкнуть по элементу в списке, посмотрев на этот пример на временной шкале Twitter (кстати, я не смог запустить пример).

То, что я делаю, не работает. Когда я вызываю listView _-> setListItemManager (новый CustomerListItemManager (customerListContainer_)), это приводит к тому, что представление списка становится пустым (до того, как я добавил этот код, показ списка отображался).

Таким образом, в основном, как получить возможность щелкнуть элемент в списке и заставить его работать.

В любом случае — вот соответствующий код того, что я пробовал до сих пор:

Container {
id: customersListContainer
objectName: "customersListContainer"
ListView {
id: customersList
objectName: "customersList"
listItemComponents: [
ListItemComponent {
type: "item"
Container {

HeaderListItem {
title: ListItemData.firstName + " " + ListItemData.lastName
}

StandardListItem {
title: ListItemData.officePhone + "\t" + ListItemData.cellPhone
description: ListItemData.email
}
]
}
}

CustomerListItemManager.cpp:

CustomerListItemManager::CustomerListItemManager() {}

CustomerListItemManager::~CustomerListItemManager() {}

VisualNode *CustomerListItemManager::createItem(ListView *list, const QString &type)
{
//the CustomerList::getInstance()->customerListContainer returns the customersListContainer (see the qml code above)
//
return new CustomerItem(CustomerList::getInstance()->customerListContainer());
}

void CustomerListItemManager::updateItem(ListView *list, VisualNode *control, const   QString &type, const QVariantList &indexPath, const QVariant &data)
{
QObject* obj = qvariant_cast<QObject *>(data);
CustomerData* customer = qobject_cast<CustomerData *>(obj);
}

CustomerItem.cpp:

CustomerItem::CustomerItem(Container *parent) : CustomControl(parent) {}

CustomerItem::~CustomerItem() {}

void CustomerItem::updateItem(const QString text, QDateTime date) {}

void CustomerItem::select(bool select) {

// Is this where you handle the response to clicking on an item on the list???
//
if (select) qDebug() << "item selected";

else;
}

void CustomerItem::reset(bool selected, bool activated) {
select(selected);
}

void CustomerItem::activate(bool activate) { Q_UNUSED(activate); }

Заполнение списка в другом файле:

for (int i = 0; i < customers->length(); ++i) {
groupDataModel_.insert(customers->at(i)
}
listView_->setDataModel(&groupDataModel_);

//the customerListContainer_ is the customersListContainer (see the qml code above)
//
listView_->setListItemManager(new ListItemManager(customerListContainer_);

3

Решение

У меня была эта проблема раньше.
По сути, из ListItemComponent вы не можете напрямую взаимодействовать с внешними элементами, используя их идентификатор, например …

Я не знаю точно, что вы хотите сделать, но вот два решения, которые у меня есть, которые могут вам помочь:

1) Использование сигнала «onTriggered», который выдается при нажатии на элемент вашего списка. Вот пример QML:

onTriggered: {
console.log("onTriggered");

// Retrieve the selected item
var chosenItem = dataModel.data(indexPath);

// Bind with C++ using a Q_INVOQUABLE method
controller.launchItem(chosenItem);
}

2) В случае выбора элемента в ListItemComponent, вы можете использовать посредническую функцию.
Например, из вашего определения ListItemComponent QML вы можете вызвать:

// Load additional comments
ListItem.view.launchAdditionalCommentButtonPressedAction();

А затем добавьте функцию к вашему ListView в вашем файле QML:

function launchAdditionalButtonPressedAction() {
// Bind with C++ using a Q_INVOQUABLE method
controller.additionalButtonPressed();
}

Я не уверен, что это именно то, что вы ищете, но я надеюсь, что это поможет.

1

Другие решения

При объявлении ListView используйте событие onTriggered как следующее

  onTriggered: {
var selectedItem = dataModel.data(indexPath);
// do something with the selected item
}
0