2011-09-29 46 views
2

我有一個QListView,它將自定義QAbstractListModel設置爲模型。該模型從數據庫加載數據並將其全部放入QList<QHash<QString, QString> > dataList數據結構中。每個QHash<QString, QString> data包含諸如data["id"]data["name"]之類的東西。 data["name"]值通過模型的data()方法傳遞給QListView。現在我想要做的是在QListView中點擊一個項目時,訪問屬於從另一個小部件中點擊的項目的QHash<QString, QString>單擊視圖中的項目時從另一個小部件訪問自定義模型數據

因此,像這樣......

connect(view, SIGNAL(clicked(...)), someOtherWidget, SLOT(foo(...))

而且在富(),我們可以例如做...

void someOtherWidget::foo(const QHash<QString, QString>& customData) { QMessageBox::information(this, "User ID", customData["id"]; }

而且它會顯示該項目的ID在消息框中輸入

+2

這裏的問題究竟是什麼? – Chris

+0

+1給克里斯,這個問題目前並不明顯。 –

回答

0

您可以在data()函數中使用特殊角色。然後 數據()將返回QHash

QVariant yourModel::data(QModelIndex index, int role) 
{ 
    .... 
    if(role == myCustomRole) 
    { 
     return QVariant::fromValue(myData[ index.row ]) 
    } 
    .... 
} 

然後在您的富功能

QHashMap<QString, QString> & model = 
    view->model()->data(view->selectedIndex(), myCustomRole) 
     .value< QHashMap<QString, QString> >(); 
0

一類而QListView有一個方便的點擊()信號,即通過對QDataIndex被點擊的項目。只要定義一個點擊插槽和您的模型的自定義信號:

signals: 
    void elementSelected (QStringHash _element); // Also, there's a string hash 
               // class, so save the <> 
public slots: 
    void onClicked (const QModelIndex &_index); 

,併爲您的小工具創建一個相應的槽:

public slots: 
    void onElementSelected (QStringHash _element); 

在onClicked,發出elementSelected()信號

void YourModel::onClicked (const QModelIndex &_index) 
{ 
    elementSelected (dataList (_index.row()) 
} 

最後,只需連接所有信號:從列表視圖中單擊()到模型和elementSelected()從您的模型到您的自定義小部件。如果您確實需要視圖來發射elementSelected()信號,而不是模型,則必須使用類似的信號定義派生自QListView的類,並將來自該模型的elementSelected()信號從模型連接到elementSelected()信號類。將信號連接到對方是完全可以的。

相關問題