单击视图中的项目时,从另一个窗口小部件访问自定义模型数据

时间:2011-09-29 17:28:23

标签: c++ qt

我有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

2 个答案:

答案 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()信号类。将信号相互连接是完全可以的。