Доступ к данным пользовательской модели из другого виджета при нажатии на элемент в представлении - PullRequest
2 голосов
/ 29 сентября 2011

У меня есть 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 голосов
/ 05 октября 2011

Класс 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())
}

Наконец, просто подключите все ваши сигналы: clicked () из представления списка к вашей модели и elementSelected () из вашей модели к вашему пользовательскому виджету. Если вам действительно нужно представление для генерации сигнала elementSelected (), а не модель, вам придется определить класс, производный от QListView, с аналогичным сигналом и подключить сигнал elementSelected () из модели к сигналу elementSelected () из этого нового учебный класс. Совершенно нормально подключать сигналы друг к другу.

0 голосов
/ 05 октября 2011

Вы можете использовать специальную роль в вашей функции 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> >();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...