Russian Qt Forum
Май 05, 2024, 13:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Молча не отрабатывает редактирование таблицы  (Прочитано 6156 раз)
sonoleo
Гость
« : Май 03, 2011, 17:00 »

Я написал уже несколько простеньких программ. Больше интересует работа с БД (MYSql). Запустил программки и заметил, что таблица не изменяется Шокированный. Пример из http://doc.crossplatform.ru/qt/4.5.0/qsqltablemodel.html
#include <QtDebug>
#include <QtGui>
#include <QSqlTableModel>
#include <QSqlError>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
   
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("testdb");
    db.setUserName("root");
    db.setPassword("");
    if (!db.open())
   {
      qDebug() << QString::fromLocal8Bit("Не смогла я открыть базу данных") << db.lastError().text();
      return -1;
   }
    QSqlTableModel *model = new QSqlTableModel(0);
    model->setTable("artists");
    model->setEditStrategy(QSqlTableModel::OnRowChange);//OnFieldChange);//OnManualSubmit);
    model->select();
//    model->removeColumn(0);//->setColumnHidden(0, true);

    QTableView *view = new QTableView;
    view->setModel(model);

    view->setWindowTitle(QString::fromLocal8Bit("Альбомы"));
    view->resize(330,350);
    view->show();
    int result = app.exec();
    delete model;
    return result;
}
Что происходит. Никаких сообщений не выдает.
Помогите  Непонимающий
Когда исправляю в одной ячейке - все нормально. Исправляю другую и восстанавливается значение в предыдущей (только на экране)
« Последнее редактирование: Май 03, 2011, 17:04 от sonoleo » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 586


Просмотр профиля
« Ответ #1 : Май 03, 2011, 18:12 »

Работает нормально. Никакх описанных эффектов не заметил.
Записан
sonoleo
Гость
« Ответ #2 : Май 03, 2011, 22:50 »

Ребята, я не шучу. Мучаюсь уже вторые сутки. Есть у кого-нить идеи?
Записан
sonoleo
Гость
« Ответ #3 : Май 04, 2011, 08:43 »

Ну что господа?
Делал эту программу с помощью -

Qt Creator 2.0.0
Основан на Qt 4.7.0 (32-х битной)
Собран Jun 21 2010 в 01:56:06
Ревизия 1c0f52a091

может она кривая? Строит глазки
Проект выглядит так:

TEMPLATE = app
QT += sql

TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += .
#customview.cpp
SOURCES += main.cpp
#customview.cpp main.cpp

Сделал ещё так
#HEADERS += .- тоже не помогло
« Последнее редактирование: Май 04, 2011, 08:46 от sonoleo » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 586


Просмотр профиля
« Ответ #4 : Май 04, 2011, 11:59 »

Возьми пример qtdir/examples/sql/tablemodel

и проверь. Все нормально работает.
Там почти твой случай. Отличается только типом БД.

Если и дальше непонятки выкладывай полный исходник проекта.
Записан
sonoleo
Гость
« Ответ #5 : Май 04, 2011, 13:33 »

я его (tablemodel) и раньше запускал, тока не проверял изменения в базе. А сейчас стал проверять, но результат отрицательный. На экране всё изменяется (конечно кроме append), а в базе нет.
Исходники использованы в qtdir/examples/sql/tablemodel. Замена на QMYSQL.
Какую инфу надо показать от меня? Строит глазки
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 586


Просмотр профиля
« Ответ #6 : Май 04, 2011, 14:34 »

выкладывай полный исходник проекта.
*.h, *.cpp, *.pro и т.д. Все zip-ом
Записан
sonoleo
Гость
« Ответ #7 : Май 04, 2011, 14:46 »

вложил, тама две папочки  Плачущий
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 586


Просмотр профиля
« Ответ #8 : Май 05, 2011, 07:15 »

Измени стратегию редактирования, например,
model->setEditStrategy(QSqlTableModel::OnFieldChange);
Записан
sonoleo
Гость
« Ответ #9 : Май 05, 2011, 08:13 »

В tablemodel.cpp в строке 50 закоментини разные варианты, в том числе и этот - OnFieldChange. От этого еще хуже. Внеся изменение в поле и нажав enter или мышкой перейдя в другое поле, старое поле восстанавливается. И в одном и в другом окне.
Попробовал update поля через SQL. Это сработало, но если в поле вводится латинскими буковками. На русские не реагирует.
А вот прямое редактирование через OnFieldChange?!!! Неужели в таком примитивном примерчике глюки есть  Крутой?
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 586


Просмотр профиля
« Ответ #10 : Май 05, 2011, 08:42 »

Ну для начала надо искать глюки у себя.

OnFieldChange работает как заявлено.

С какой базой проверяешь и какими средствами?
Если есть проблемы с русскими буквами для MySql то надо смотреть кодировку дя клиента сервера MySql и соответственно ей дать запрос к базе что-то типа     SET NAMES cp1251 ( для случая кодировки для клиента cp1251 )

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Май 05, 2011, 09:04 »

Советую OnManualSubmit выставить и проверять bool QSqlTableModel::submit (), если false, то lastError проверить.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
sonoleo
Гость
« Ответ #12 : Май 05, 2011, 10:03 »

С какой базой проверяешь и какими средствами?
Если есть проблемы с русскими буквами для MySql то надо смотреть кодировку дя клиента сервера MySql и соответственно ей дать запрос к базе что-то типа     SET NAMES cp1251 ( для случая кодировки для клиента cp1251 )
MySQL 5.0 проверяю с помощью HeidiSQL\heidisql.exe. С этим - SET NAMES cp1251 - уже применял, разберусь.
Базу создавал с cp1251 и cp1251_general_cs

Советую OnManualSubmit выставить и проверять bool QSqlTableModel::submit (), если false, то lastError проверить.
попробую lastError проверить.
Записан
Pretorean
Гость
« Ответ #13 : Сентябрь 20, 2011, 00:36 »

сорри за некропостинг
наступил на те же грабли и этот топик нашел поиском

если сделать model->removeColumn(0) а так как первый столбец таблицы это обычно первичный ключ, то модель переходит в режим только для чтения.
самое простое что пришло в голову это сделать tableView->hideColumn(0)
возможны и другие решения, но я не копал дальше
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.