Название: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 12:26
Работаю с бд sqlite через модель QSqlRelationalTableModel. m_sessionModel = new DataBaseEngine(); m_sessionModel->setTable("sessions"); m_sessionModel->select(); // установка заголовков таблицы m_sessionModel->setHeaderData(0, Qt::Horizontal,QObject::tr("дата")); m_sessionModel->setHeaderData(1, Qt::Horizontal,QObject::tr("Мышь")); m_sessionModel->setHeaderData(2,Qt::Horizontal,QObject::tr("Клавиатура")); m_sessionModel->setHeaderData(3,Qt::Horizontal,QObject::tr("Блокировка")); метод select() выбирает все поля из таблицы. А как мне быть если мне нужны некоторые поля? Смотрела в сторону фильтров, но это не то, они фильтруют уже выбранные данные. Может как-то можно задать запрос select в этой модели.
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 12:42
Если пишу так QSqlQuery query; QString queryString = "select name,title,flagActivity from sessions"; query.exec(queryString); m_sessionModel = new DataBaseEngine(); m_sessionModel->setTable("sessions"); m_sessionModel->setQuery(query); m_sessionModel->select(); // установка заголовков таблицы m_sessionModel->setHeaderData(0, Qt::Horizontal,QObject::tr("дата")); m_sessionModel->setHeaderData(1, Qt::Horizontal,QObject::tr("Мышь")); m_sessionModel->setHeaderData(2,Qt::Horizontal,QObject::tr("Клавиатура")); m_sessionModel->setHeaderData(3,Qt::Horizontal,QObject::tr("Блокировка")); то в таблице ничего не выводится, такое впечатление что запрос не выполняется.
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 12:50
Решила проблему с помощью removeColumn(); Не очень мне это нравится. Если у кого есть другие идеи поделитесь, пожалуйста)
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 12:52
Ещё один вопросик, как в цикле пройтись по выбранным полям в модели? Мне нужно значение поля равное 1 заменить на слова "да". Или есть какой-то другой красивый способ это сделать?
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 13:51
Попробовала так: m_windowModel = new DataBaseEngine(); m_windowModel->setTable("listwindow"); QSqlQuery query; QString queryString = "select name,title,flagActivity from sessions"; query.exec(queryString); QModelIndex index;
for (int i=0; i <query.size(); i++){ // название программы index = m_windowModel->index(i,0); m_windowModel->setData(index,query.value(0).toString()); // заголовок окна index = m_windowModel->index(i,1); m_windowModel->setData(index,query.value(1).toString()); // фокус ввода index = m_windowModel->index(i,2); if (query.value(2).toBool()) m_windowModel->setData(index,"да"); else m_windowModel->setData(index,"нет"); query.next(); } // установка заголовков таблицы m_windowModel->setHeaderData(0, Qt::Horizontal,QObject::tr("программа")); m_windowModel->setHeaderData(1, Qt::Horizontal,QObject::tr("заголовок окна")); m_windowModel->setHeaderData(2,Qt::Horizontal,QObject::tr("фокус ввода")); Но ничего не выберает... Подскажите, в чем ошибка?
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 15:12
Не могу понять почему не устанавливаются данные. QSqlQuery query; QString queryString = "select name,title,flagActivity from listwindow"; if(!query.exec(queryString)) qDebug()<<"ошибка...";
m_windowModel->insertColumn(0); m_windowModel->insertColumn(1); m_windowModel->insertColumn(2); QModelIndex index; int i = 0; while(query.next()){ // название программы m_windowModel->insertRow(i);
index = m_windowModel->index(i,0); m_windowModel->setData(index,query.value(0).toString()); // заголовок окна index = m_windowModel->index(i,1); m_windowModel->setData(index,query.value(1).toString()); // фокус ввода index = m_windowModel->index(i,2); if (query.value(2).toBool()) m_windowModel->setData(index,"да"); else m_windowModel->setData(index,"нет"); i++; qDebug()<<"wwww";
}
// установка заголовков таблицы m_windowModel->setHeaderData(0, Qt::Horizontal,QObject::tr("программа")); m_windowModel->setHeaderData(1, Qt::Horizontal,QObject::tr("заголовок окна")); m_windowModel->setHeaderData(2, Qt::Horizontal,QObject::tr("фокус ввода"));
Из таблицы бд данные выбираются, столбцы с заголовками создались и одна пустая строка и всё. А почему не добавляются данные в ячейки? Наверное что-то не так с индексами? Помогите ребята, пожалуйста, разобраться!
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 17:01
Что ни у кого нет идей ??? Не верится прям...
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 17:09
Решила проблему и довольно просто получилось) m_windowModel = new DataBaseEngine(); m_windowModel->setTable("listwindow"); m_windowModel->select(); for (int i=0; i<m_windowModel->rowCount(); i++){ QModelIndex index = m_windowModel->index(i,2); if (index.data().toBool()) m_windowModel->setData(index,"да"); } m_windowModel->removeColumn(0); // установка заголовков таблицы m_windowModel->setHeaderData(1, Qt::Horizontal,QObject::tr("программа")); m_windowModel->setHeaderData(2, Qt::Horizontal,QObject::tr("заголовок окна")); m_windowModel->setHeaderData(3, Qt::Horizontal,QObject::tr("фокус ввода")); А я как-то сложно до этого думала ;D
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 11, 2012, 18:09
Ну всё же у меня не получается задать свой sql запрос. Он не выполняется... QSqlQuery query("select * from listwindow where date='2012-07-11 17:56:44'"); m_windowModel = new DataBaseEngine(); m_windowModel->clear(); m_windowModel->setTable("listwindow"); m_windowModel->setQuery(query); m_windowModel->select(); qDebug()<<m_windowModel->rowCount();
for (int i=1; i <= m_windowModel->rowCount()+1; i++){
QModelIndex index = m_windowModel->index(i,3);
if (index.data().toBool() && m_windowModel->index(i,4).data().toBool()) m_windowModel->setData(m_windowModel->index(i,3),"активно"); else if (index.data().toBool()) m_windowModel->setData(index,"да"); else m_windowModel->setData(m_windowModel->index(i,3),"нет"); }
m_windowModel->removeColumn(0); m_windowModel->removeColumn(3);
// установка заголовков таблицы m_windowModel->setHeaderData(0, Qt::Horizontal,QObject::tr("программа")); m_windowModel->setHeaderData(1, Qt::Horizontal,QObject::tr("заголовок окна")); m_windowModel->setHeaderData(2, Qt::Horizontal,QObject::tr("фокус ввода")); Если в этом коде убрать строки связанные с QSqlQuery, то всё прекрасно работает. Как же мне запрос прикрутить? Фильтрами не хочется пользоваться, так как какой смысл все данные выбирать а потом фильтровать, если можно выбрать сразу нужное. Подскажите ребята.
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: Странник от Июль 11, 2012, 23:33
используйте setFilter и не выпендривайтесь - это именно то, что вам нужно. m_windowModel->setFilter("date='2012-07-11 17:56:44'");
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 12, 2012, 13:59
окей. Ребята, я почему-то не могу разобраться почему у меня в модели в последнюю ячейку не устанавливается значение ? Во все ячейки ставится, а в последнюю хоть убейся не хочет... Я уже и принудительно пыталась, не хочет. for (int i=0; i <= model->rowCount()-1; i++){
//QModelIndex index = index(i,3); qDebug()<<model->index(i,3).data().toInt(); if (model->index(i,3).data().toInt() == 1 && index(i,4).data().toInt() == 1) model->setData(model->index(i,3),"активно"); else if (model->index(i,3).data().toInt() == 0) model->setData(model->index(i,3),"нет");
else if (model->index(i,3).data().toInt() == 1){ model->setData(model->index(i,3),"да"); qDebug()<<"!!!!";} }
model->removeColumn(0); model->removeColumn(3); model->setData(model->index(model->rowCount(),3),4); В цикле проверяю, я дохожу до последней записи, но значение не устанавливается... Пожалуйста подскажите в чём косяк ????
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: Странник от Июль 12, 2012, 14:17
окей. Ребята, я почему-то не могу разобраться почему у меня в модели в последнюю ячейку не устанавливается значение ? Во все ячейки ставится, а в последнюю хоть убейся не хочет... Я уже и принудительно пыталась, не хочет. В цикле проверяю, я дохожу до последней записи, но значение не устанавливается... Пожалуйста подскажите в чём косяк ????
в какую именно ячейку? индекс ее укажите, пожалуйста. в любом случае в строке model->setData(model->index(model->rowCount(),3),4); вы пытаетесь установить данные в ячейку по несуществующему индексу.
Название: Re: Работа с моделью QSqlRelationalTableModel
Отправлено: virtual_root от Июль 12, 2012, 15:19
Я покажу скриншот моей таблицы. А вот код которым я достаю данные из неё, заменяю 0 и 1 в третьем столбце ловами "да" или "нет" соответственно. Почему он не обрабатывает последнюю ячейку не могу понять... DataBaseEngine* WindowsModel::windowModel(){
DataBaseEngine *model = new DataBaseEngine();
model->clear(); model->setTable("listwindow"); model->select();
for (int i=0; i <= model->rowCount()-1; i++){
qDebug()<<model->index(i,3).data().toInt(); if (model->index(i,3).data().toInt() == 1 && index(i,4).data().toInt() == 1) model->setData(model->index(i,3),"активно"); else if (model->index(i,3).data().toInt() == 0) model->setData(model->index(i,3),"нет");
else if (model->index(i,3).data().toInt() == 1){ model->setData(model->index(i,3),"да"); qDebug()<<"!!!!";} }
model->removeColumn(0); model->removeColumn(3); model->setData(model->index(model->rowCount()-1,3),4); // даже так не работает...
// установка заголовков таблицы model->setHeaderData(0, Qt::Horizontal,QObject::tr("программа")); model->setHeaderData(1, Qt::Horizontal,QObject::tr("заголовок окна")); model->setHeaderData(2, Qt::Horizontal,QObject::tr("фокус ввода"));
return model; } Приведу скриншот приложения. Во второй таблице в последнем столбце в последней ячейки вместо слова "да" остаётся 1... Что я уже только не пробовала, не помогает...
|