РЕДАКТИРОВАТЬ: 26.08.2014 08:20 — полностью переработанный вопрос!
Что я хочу сделать, это:
У меня есть два cpp-класса:
DataModel.cpp:
QVariant DataModel::data(const QModelIndex &index, int role) const
{
DataModelItem *item = m_itemList.at(index.row());
switch (role) {
case ListDataRole:
return QString().sprintf("%.2f", item->listData());
break;
case DetailsDataRole:
return QString().sprintf("%.4f", item->detailsData());
break;
default:
qDebug () << "role not handled";
}
return QVariant();
}
Теперь я хочу отобразить listData в ListView. Когда я нажимаю на один ListItem, должно появиться диалоговое окно с detailsData.
Я понял, что я не могу написать model.detailsData в моем основном приложении, но работает только detailsData (я также попробовал listview.model.detailsData безрезультатно). Вероятно, кто-то знает, почему это не работает.
Во всяком случае, я нашел решение.
Вот рабочий пример:
main.qml
import QtQuick 1.1
Rectangle {
width: 200
height: 400
ListView {
id: listView
model: dataModel
delegate: listDelegate
}
Component {
id: listDelegate
Item {
id: delegateItem
width: listDataText.width
height: listDataText.height
Text {
id: listDataText
text: listData
}
MouseArea {
anchors.fill: parent
onClicked: {
console.log(detailsData)
itemDetails.details = model.detailsData
itemDetails.visible = true
}
}
}
}
DetailsDialog {
id: itemDetails
visible: false
anchors.centerIn: parent
}
}
DetailsDialog.qml
import QtQuick 1.1
Rectangle {
property alias details: detailsText.text
width: 100
height: 62
Text {
id: detailsText
}
}