我有QListView
设置自定义QAbstractListModel
作为模型。该模型从数据库加载数据并将其全部放在QList<QHash<QString, QString> > dataList
数据结构中。每个QHash<QString, QString> data
都包含data["id"]
和data["name"]
等内容。 data["name"]
值通过模型的QListView
方法传递给data()
。现在我要做的是在QHash<QString, QString>
中点击某个项目时,从另一个小部件访问属于所点击项目的QListView
。
所以这样......
connect(view, SIGNAL(clicked(...)), someOtherWidget, SLOT(foo(...))
在foo()中我们可以做例如......
void someOtherWidget::foo(const QHash<QString, QString>& customData) { QMessageBox::information(this, "User ID", customData["id"]; }
它会在消息框中显示项目的 id 。
答案 0 :(得分:0)
您可以在data()函数中使用特殊角色。 data()将返回QHash
QVariant yourModel::data( QModelIndex index, int role )
{
....
if( role == myCustomRole )
{
return QVariant::fromValue( myData[ index.row ] )
}
....
}
然后在你的foo函数中
QHashMap<QString, QString> & model =
view->model()->data( view->selectedIndex(), myCustomRole )
.value< QHashMap<QString, QString> >();
答案 1 :(得分:0)
QListView类有一个方便的clicked()信号,它为已点击的项传递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()信号类。将信号相互连接是完全可以的。