crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Каким образом QTableView меняет QSqlQuery?, Ткните плс носом туда, где об этом подробно написанно.
Stanislaus
  опции профиля:
сообщение 23.4.2008, 16:09
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


Столкнулся тут с неким багом(?). Сделал обработчик сигнала doublrClicked для QTableView:
connect(ui.scripts, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(updateScript(QModelIndex)));


Сам слот:
void ScriptEditor::updateScript(const QModelIndex &index)
{

    QSqlDatabase db = QSqlDatabase::database("mc");
    QSqlQuery scripts_query = dynamic_cast<QSqlQueryModel *>(ui.scripts->model())->query();

    QSqlQuery q(db);
    if (!q.prepare("select gui.fetch_script(?)"))
        qDebug() << "F*ck!";
    q.bindValue(0,scripts_query.record().value("id").toInt());
    
    if (!q.exec())
        qDebug() << "F*ck!";
    q.next();
    QTextDocument *doc = new QTextDocument;
    doc->setPlainText(q.value(0).toString());
    if (scripts_query.value(4).toInt()==PERL) phl.setDocument(doc);
    ui.scriptEdit->setDocument(doc);
    currentScriptID = scripts_query.value(0).toInt();
    ui.scriptCaption->setText(scripts_query.value(1).toString());
}


Коннекшн:

void MainWin::initConnections ()
{
    QSqlDatabase db;
    if (QSqlDatabase::isDriverAvailable("QPSQL"))

        db = QSqlDatabase::addDatabase("QPSQL", "mc");
    else {
        qDebug() << trUtf8("Нету драйвера для postgreSQL..."));
        return;
    }
    db.setHostName("10.10.1.123");
    db.setPort(5433);
    db.setDatabaseName("DBNAME");
    db.setUserName("user");
    db.setPassword("password");
    if (!db.open()){
        QMessageBox::critical(this, trUtf8("Мдя..."), db.lastError().text());
        return;
    }
}


Когда я открываю даблкликом документы перемещаясь по строкам вниз QTableView, все нормально, но, как только я начинаю перемещаться с нижних строк на верхние, он открывает предыдущий нижний документ (последний scripts_query.value(1) == предыдущему scripts_query.value(1)), хотя вью и модель изменились.

У меня Qt GPL 4.3.4, скомпилированная Visual C++ 2008 Express Edition, h-ки и библиотеки для PSQL от PostgreSQL 8.3.1.

Хочу добавить, что под X11 все пашет идеально.

Короче застрял, если нужны какие-нибудь дополнительные данные, сообщите.

Сообщение отредактировал Stanislaus - 23.4.2008, 16:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
ViGOur
  опции профиля:
сообщение 23.4.2008, 16:45
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Я ни как не могу понять, как ты получаешь свою позицию в QTableView?
const QModelIndex &index не задействован...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Stanislaus
  опции профиля:
сообщение 23.4.2008, 16:58
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


Дело в том, что const QModelIndex &index - индекс модели и мне он не интересен, т.к. столбец с ID я от туда все равно удалил. Единственное место где я его могу получить - QSqlQuery, который лежит в основе модели. А в обязанности модели входит управление указателем на текущую запись QSqlQuery (query.record()) и я этим пользуюсь, но, как выяснилось, под Win32 это не очень стабильно работает. Либо View, либо Controller где-то портят всю эту цепочку.

Сообщение отредактировал Stanislaus - 23.4.2008, 17:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 23.4.2008, 17:19
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(' date='23.4.2008, 17:58) *
но, как выяснилось, под Win32 это не очень стабильно работает. Либо View, либо Controller где-то портят всю эту цепочку.
Именно так.

Мне кажется ты не до конца понимаешь, что такое модельные индексы, так как модели как я понимаю фиалетово, есть у тебя "столбец с ID" или нет.
Модельные индексы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Stanislaus
  опции профиля:
сообщение 23.4.2008, 17:20
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот собсно запрос к базе:
void ScriptEditor::updateScripts()
{

    QSqlDatabase db = QSqlDatabase::database("mc");
    QSqlQuery groups_query = dynamic_cast<QSqlQueryModel *>(ui.group->model())->query();
    SBSScriptsModel *model = new ScriptsModel;
    QSqlQuery q(db);
    q.prepare("select * from gui.fetch_script_list(?)");
    q.bindValue(0,groups_query.value(0).toInt());
    q.exec();
    model->setQuery(q);
    model->removeColumns(1,2);
    model->removeColumns(3,2);
    model->setHeaderData(0, Qt::Horizontal, trUtf8("Метка"));
    model->setHeaderData(1, Qt::Horizontal, trUtf8("Язык"));
    ui.scripts->setModel(model);
    ui.scripts->resizeRowsToContents();
    ui.scripts->resizeColumnsToContents();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.4.2008, 17:26
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


индекс модели и поле ID связаны лишь косвенно, что у тебя за модель то вообще? QSqlQueryModel?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Stanislaus
  опции профиля:
сообщение 23.4.2008, 17:29
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 23.4.2008, 18:26) *
индекс модели и поле ID связаны лишь косвенно, что у тебя за модель то вообще? QSqlQueryModel?

Да, class ScriptsModel : public QSqlQueryModel.

Сейчас попробую переделать все с использованием индекса.

Сообщение отредактировал Stanislaus - 23.4.2008, 17:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Stanislaus
  опции профиля:
сообщение 23.4.2008, 18:16
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


Короче вот так, заменил:
QSqlQuery scripts_query = dynamic_cast<QSqlQueryModel *>(ui.scripts->model())->query();

на
QSqlQuery scripts_query = dynamic_cast<QSqlQueryModel *>(index.model())->query();

т.к. полюбому мне нужен query, что бы иметь доступ к полю "id"... но соответственно напоролся на cannot use 'dynamic_cast' to convert from 'const QAbstractItemModel *' to 'QSqlQueryModel *'...

Насколько я помню, все изменения в Model (в котором я это поля удалил, чтобы оно во View не появилось) не затрагивают лежащие в основе данные (в данном случае QSqlQuery).

Например, есть у меня 5 кортежей данных (и соответственно 5 строк во View).
id    mark                        lang
12    CMN::DEBUG             JavaScript
21    CORP::CHECK_ICQ    Perl
34    PN::ATOMOHOST        CSS
45    U3::TASKBAR             JavaScript
56    U3::DESCTOP             JavaScript


В QTableView следующее:
1    CMN::DEBUG             JavaScript
2    CORP::CHECK_ICQ    Perl
3    PN::ATOMOHOST        CSS
4    U3::TASKBAR             JavaScript
5    U3::DESCTOP             JavaScript


Например, открываю я 1 запись, CMN::DEBUG:
index.row() == 0, scripts_query.record().value("id").toInt() == 12, Good

спускаюсь ниже, открываю 3 запись, PN::ATOMOHOST:
index.row() == 2, scripts_query.record().value("id").toInt() == 34, Good

спускаюсь еще ниже, открываю 4 запись, U3::TASKBAR:
index.row() == 3, scripts_query.record().value("id").toInt() == 45, Good

теперь хочу подняться наверх и открываю 2 запись, CORP::CHECK_ICQ:
index.row() == 1, scripts_query.record().value("id").toInt() == 45, Ooops, модель забыла перевести стрелки...

поднимаюсь еще наверх, открываю 1 запись, CMN::DEBUG:
index.row() == 0, scripts_query.record().value("id").toInt() == 21, Ooops, указывает на id предыдущей записи... типа квантовый скачок в прошлое

спускаюсь к 4 записи, U3::TASKBAR:
index.row() == 3, scripts_query.record().value("id").toInt() == 45, Good, указывает на верный id опять...

индекс модели всегда верный, но при смене направлениявниз-вверх происходит вот такая лажа...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.4.2008, 18:48
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(' date='23.4.2008, 22:16) *
QSqlQuery scripts_query = dynamic_cast<QSqlQueryModel *>(ui.scripts->model())->query();

тут может конечно я тормоз, но я эту строчку категорически не понимаю.
что общего между QSqlQuery и QSqlQueryModel?
т.е. между моделью и запросом?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Stanislaus
  опции профиля:
сообщение 23.4.2008, 19:04
Сообщение #10


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 23.4.2008
Пользователь №: 156

Спасибо сказали: 0 раз(а)




Репутация:   0  


QSqlQuery - данные, которыми управляет QSqlQueryModel согласно MVC. Меняются данные, оповещаются все вью. Меняются вью, изменяются данные посредством QSqlQueryModel и опять оповещаются все вью. А перемещение селекшена, на мой взгляд - изменение вью. Просто если эта реализация нормально работает на одной платформе (X11) и работает коряво на другой (Win32), не стоит ли это считать багом?

Просто, если бы кто-нибуть посоветовал мне, как мне изъять заветный "id" без обращения к QSqlQuery и что-бы этот самый "id" не светился во вью, я был бы бесконечно благодарен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 22.6.2025, 7:47