Russian Qt Forum
Ноябрь 23, 2024, 03:54
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Qt Quick
(Модератор:
navrocky
) >
Работа с ЛистВью и делегатами
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Работа с ЛистВью и делегатами (Прочитано 4342 раз)
qt_newer
Гость
Работа с ЛистВью и делегатами
«
:
Январь 19, 2015, 19:17 »
Есть список (id, name получаемый из базы данных), по нажатию на элемент которого должно открываться диалоговое окно с вопросом удалить ли текущую строку, если да, то в записи с соответствующим id изменяется поле deleted, и она перестает отображаться в списке.
Я могу передать index спп слоту, но не знаю, как передать id. После апдейта таблицы есть 2 возможности: обновить модель в спп- в ContextProperty (что я сейчас делаю), либо убрать тек. запись внутри qml.
Таким образом, у меня 2 вопроса:
1) как удалить запись из модели внутри qml?
2) как получить id текущей записи в диалоговом окне?
Пример ниже:
ListView {
id: mylist
model: mymodel
delegate:
Rectangle
{
Text {
text: id + ' ' +name
}
}
...
MouseArea
{
anchors.fill: parent
onClicked:
{
mylist.currentIndex = index;
mydialog.popupVisible = true
}
}
}
CustomDialog {
id: mydialog
popupVisible: false
Button {
...
onClicked: {
mydialog.popupVisible = false
// call cpp slot with id as parameter
}
}
}
«
Последнее редактирование: Январь 19, 2015, 22:47 от qt_newer
»
Записан
carrygun
Гость
Re: Работа с ЛистВью и делегатами
«
Ответ #1 :
Январь 20, 2015, 05:24 »
mylist.model.get(mylist.currentIndex).id
Записан
qt_newer
Гость
Re: Работа с ЛистВью и делегатами
«
Ответ #2 :
Январь 20, 2015, 12:55 »
Спасибо, но у меня модель наследуется от QSqlQueryModel и там нет метода get(), т.е. при попытке использовать mylist.model.get(mylist.currentIndex).id, получаю "Property 'get' of object is not a function"
В спп такой код выдает корректный ответ:
QModelIndex ind = mymodel.index(1, 0,QModelIndex());
qDebug() << "just test ID: " << mymodel.data(ind, Qt::UserRole).toInt();
Но использовать его в qml пока не получается:
console.log("current ID: " + mylist.model.data(mylist.currentIndex, mylist.model.UserRole )) выдает current ID: undefined
Вероятно, что-то не так с ролью, либо с определением модели:
class myModel : public QSqlQueryModel
{
Q_OBJECT
public:
myModel(QObject* parent = 0)
: QSqlQueryModel(parent)
{
roleNamesHash.insert(Qt::UserRole, QByteArray("id"));
roleNamesHash.insert(Qt::UserRole + 1, QByteArray("name"));
}
Q_INVOKABLE QVariant data(const QModelIndex& index, int role) const
{
if(role < Qt::UserRole) {
return QSqlQueryModel::data(index, role);
}
QSqlRecord r = record(index.row());
return r.value(role - Qt::UserRole);
}
QHash<int, QByteArray> roleNames() const { return roleNamesHash; }
private:
QHash<int, QByteArray> roleNamesHash;
};
Если я дополнительно определяю в модели:
Q_INVOKABLE QVariant get(const QModelIndex& index) const
{
QSqlRecord r = record(index.row());
return r.value(0);
}
то это опять работает в спп:
qDebug() << "2nd test ID: " << mymodel.get(ind).toInt();
и не работает в qml:
console.log( "2nd test ID:" + mylist.model.get(mylist.currentIndex)) - возвращает 0
PS Код должен работать в Qt 5.0
«
Последнее редактирование: Январь 20, 2015, 13:02 от qt_newer
»
Записан
carrygun
Гость
Re: Работа с ЛистВью и делегатами
«
Ответ #3 :
Январь 20, 2015, 13:07 »
У вас функция ожидает QModelIndex, а вы передаете int.
Записан
qt_newer
Гость
Re: Работа с ЛистВью и делегатами
«
Ответ #4 :
Январь 20, 2015, 13:17 »
да, похоже на то
Я передаю mylist.currentIndex, а как передавать индекс модели ?
ListView {
id: mylist
model: mymodel
delegate:
...
MouseArea
{
anchors.fill: parent
onClicked:
{
mylist.currentIndex = index;
mydialog.popupVisible = true
}
}
}
Записан
qt_newer
Гость
Re: Работа с ЛистВью и делегатами
«
Ответ #5 :
Январь 20, 2015, 13:31 »
PS получилось только в спп функцию get() переделать, чтобы она int принимала, тогда все работает
Записан
qt_newer
Гость
Re: Работа с ЛистВью и делегатами
«
Ответ #6 :
Январь 20, 2015, 19:53 »
Спасибо с первой частью удалось разобраться, но теперь не знаю, как обновить листвью после изменения таблицы в спп слоте.
Если я делаю в спп слоте:
QSqlQuery q;
QString s= "UPDATE mytable SET deleted = 1 WHERE id ="+ id;
if (!q.exec(s))
qDebug() << q.lastError() << "in " << s;
myModel mymodel;
mymodel.setQuery("select * from mytable where deleted=0);
view->rootContext()->setContextProperty("mymodel", &mymodel);
то это даже срабатывает для первой удаленной записи, но при попытке удалить еще одну- приложение вылетает
Также я пробую вместо обновления контекста сделать рефреш модели:
QModelIndex ind = this->index(0, 0,QModelIndex());
QModelIndex ind2 = this->index(rowCount()-1, columnCount()-1,QModelIndex());
QVector<int> v;
v << Qt::UserRole << Qt::UserRole + 1 << Qt::UserRole + 2 ...
emit dataChanged(ind, ind2, v);
но в этом случае записи c делетед = 1 продолжают отображаться в листвью.
Заранее спасибо за любые советы!
«
Последнее редактирование: Январь 20, 2015, 20:00 от qt_newer
»
Записан
qt_newer
Гость
Re: Работа с ЛистВью и делегатами
«
Ответ #7 :
Январь 22, 2015, 11:28 »
Удалось разобраться самостоятельно, проблема была в том, что при начальной установке и в спп слоте использовались разные объекты модели- введение синглтона решило проблему, и стало достаточно использовать в слоте:
myModel *myModel = myModel::getInstance();
myModel->setQuery(sql);
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...