Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Июль 11, 2012, 12:26



Название: Работа с моделью 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... Что я уже только не пробовала, не помогает...