2011-09-29 49 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()信号类。将信号连接到对方是完全可以的。

相关问题