3

Blackberry のリストの項目をクリックできるようにする方法を見つけようとしています。QML、C++、QT、および Blackberry 10 Cascades を使用しています。リスト ビューを実装してから、この Twitter タイムラインの例を見て、リストの項目をクリックできるようにしようとしました (ところで、例を実行できませんでした)。

私がやっていることはうまくいきません。listView_->setListItemManager(new 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_);
4

2 に答える 2

1

私は以前にこの問題を抱えていました。基本的に、ListItemComponent から、たとえば ID を使用して外部要素と直接対話することはできません...

あなたが何をしたいのか正確にはわかりませんが、私が持っている2つの解決策があなたを助けるかもしれません:

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();

次に、QML ファイルの ListView に関数を追加します。

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

これがまさにあなたが探しているものかどうかはわかりませんが、これが役立つことを願っています.

于 2013-03-30T10:27:05.433 に答える
0

ListView の宣言では、onTriggered イベントを次のように使用します。

  onTriggered: {
                  var selectedItem = dataModel.data(indexPath);
                 // do something with the selected item
               }
于 2012-11-11T12:21:10.700 に答える