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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу  (Прочитано 7933 раз)
RVZ
Гость
« : Октябрь 06, 2010, 12:22 »

Всем доброе время суток!
Ни как не могу разобраться как заставить QComboBox editable добавлять новые значения в таблицу


то есть есть две таблицы одна с парой (первичный ключ; значение)
А вторая основная с массой столбцов (один из которых внешний ключ к первой)

в общем все как бы работает до тех пор пока достаточно значений в первой таблице
как только надо что то добавить значение(текст) в QComboBox вводится(с клавы) но в таблицы не попадает
у кого нибудь есть пример как это реализовать
У меня только пока идея обнюхивать все изменения QComboBox и если значение новое инсертить его в таблицу SQL запросом но уж как то сильно педалями отдает такой метод может у QComboBox есть бортовой метод?
Записан
RVZ
Гость
« Ответ #1 : Октябрь 07, 2010, 15:07 »

Что то мне подсказывает что наверное с делегатом лажа какаято

QDataWidgetMapper *mapper = new QDataWidgetMapper();
mapper->setItemDelegate(new QSqlRelationalDelegate());

Сохраняет в базе только текстовые поля
На изменение даты кречит
QODBCResult::exec: unable to bind variable: "[Microsoft][SQL Server Native Client 10.0]Optional feature not implemented"
Записан
crossly
Гость
« Ответ #2 : Октябрь 07, 2010, 15:18 »

тебе ODBC ругается... причем тут делегат??
Записан
RVZ
Гость
« Ответ #3 : Октябрь 07, 2010, 15:43 »

Ну наверное потому что в момент изменения поля с датой происходит эта ругань
А LineEdit нормально меняется
Думаю что это делегат данные портит от поля с датой
Записан
RVZ
Гость
« Ответ #4 : Октябрь 07, 2010, 18:02 »

И так в общем добавление новых строк из QComboBox решил пидальным способом расстраивает только то что QComboBox много в проекте
Код:

void DataE::addrow(QString Ed){
//слот всовывания  ;D
    ......
    QSqlQuery test;
    test.exec("SELECT id FROM ct.Cities WHERE City ='"+Ed+"'");
    //ct.Cities таблица с первичным ключем id и соответственно значением City(придется индексировать)
    if(!test.first()){ //проверяем есть ли что в результате
        QMessageBox::about(this, "Mod","New "+Ed);
        //если результат пустой записываем значение а ключь сам по себе прибавится
        test.exec("INSERT INTO ct.Cities(City) VALUES('"+Ed+"')");
    }
    else{QMessageBox::about(this, "Mod ","Est"+Ed);}
    .......
}

//коннектим сиглал activated(QString)) то QComboBox к слоту addrow(QString)
connect(ui->City,SIGNAL(activated(QString)),this,SLOT(addrow(QString)));
//теперь каждое выбранное значение будет селектится к базе  :'(
Можно конечно было и класс QComboBox переопределить и присутствие значеня проверять в боксе
но как я предполагаю есть готовые решения просто мне пока не известные и данный костыль тока на первое время чтобы просто работало

Ну а с датой бяда надо что то делать  Непонимающий
Записан
RVZ
Гость
« Ответ #5 : Октябрь 09, 2010, 23:26 »

В общем разобрался с датой
По мимо ComboBox на форме были еще и dateedit поля которые не хотели сохранятся оказалось что причина тип в поле таблицы SmallDateTime при попытки записи выдавал это QODBCResult::exec: unable to bind variable: "[Microsoft][SQL Server Native Client 10.0]Optional feature not implemented" хотя формат указанный в dateedit был похож
поменял тип столбца в таблице на DateTime и все заработало.
P.S. Движок MSSQL2005
« Последнее редактирование: Октябрь 09, 2010, 23:27 от RVZ » Записан
DrHaos
Гость
« Ответ #6 : Октябрь 10, 2010, 23:13 »

У проблема похожая на сколько я понимаю, есть QtSqlRelationalTableModel, у нее одно из полей внешний ключ (fkey) ну и соответвенно связанная таблица ID, Name. Все поля таблицы привязаны к виджетам на форме через QDataWidgetMapper, fkey привязан к ComboBox. При добавлении в связную таблицу нового значения в ComboBox оно отображается, в самой связной таблице добавляется но выбрать его в главной таблице не получается. После перезапуска приложения данный пункт выбрать уже можно.
Записан
RVZ
Гость
« Ответ #7 : Октябрь 10, 2010, 23:37 »

Цитировать
При добавлении в связную таблицу нового значения
Что то не понятно как значение добавляется?
-внешним каким то действием например от другой программы
-каким нибудь слотом SQL операции
-или самим ComboBox добавляет(так у меня не получилось хотя не понятно почему)

Цитировать
в ComboBox оно отображается, в самой связной таблице добавляется
по идеи модель держит курсор открытым и в ComboBox изменения таблиц должны отображаться в реальном времени  
а вот данные попадают в таблицу BD из модели в зависимости от выбранного способа редактирования например ручное потверждение
Код:
model->setEditStrategy(QSqlTableModel::OnManualSubmit);

Цитировать
но выбрать его в главной таблице не получается. После перезапуска приложения данный пункт выбрать уже можно.
Непонятно чем выбрать
но может имеет смысл заново проселектить модельку

И как проверял что значения попали в таблицу
« Последнее редактирование: Октябрь 10, 2010, 23:39 от RVZ » Записан
RVZ
Гость
« Ответ #8 : Октябрь 14, 2010, 11:34 »

Цитировать
У проблема похожая на сколько я понимаю, есть QtSqlRelationalTableModel

Мда.... Сам только что обратил внимание что запись в связанную таблицу добавляется а в основную (submitAll()) значение не сохраняется причем не сохраняется не только значение данного QComboBox но и всех остальных.
Что с этим делать пока не придумал  Непонимающий

Неужели ни кто не сталкивался с такой проблемой?НепонимающийНепонимающий
« Последнее редактирование: Октябрь 14, 2010, 12:10 от RVZ » Записан
DrHaos
Гость
« Ответ #9 : Октябрь 14, 2010, 13:59 »

Есть кое какая информация http://pythonistaa.blogspot.com/ но это уже танцы с бубном, не очень хочется этим заниматься еще http://bugreports.qt.nokia.com/browse/QTBUG-10056 так что это вполне может быть просто багом.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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