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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Stanislaus
  опции профиля:
сообщение 23.4.2008, 18:16
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 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 опять...

индекс модели всегда верный, но при смене направлениявниз-вверх происходит вот такая лажа...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


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