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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает QDataWidgetMapper  (Прочитано 3027 раз)
Terminate
Гость
« : Февраль 07, 2011, 01:37 »

Началось всё с того, что у меня был готовый проект который пользовал SQLite. Но вот решил я перевести его на MySQL. Собрал плагин, прописал драйвер, создал таблицы все - всё сделал. Изменил некоторые запросы специфичные для мускула(ну типа там CURDATE()) и всё такое. В базу запросы пишутся, читаются - всё хорошо. И я думал что победил... Но... перестали работать все мапперы в проекте. Их три штуки - они все не работают. Для маппера вызывается отдельное диалоговое окно, стоит setSubmitPolicy(QDataWidgetMapper::AutoSubmit), всё вроде бы как положено. И с SQLite-ом это всё прекрасно работало. Более того, поля не редактируются, если щёлкать по ячейкам таблицы(TableView). Хотя тоже там прописано "эдитТриггерс" и тд. Оно редактирует поле, но в базу не записывает... Тоесть не работают ни мапперы, ни редактирование ячеек непосредственно в таблице. Что ему не нравися - я понять не могу... Не работает на таблицах на которых нет ни отношений, ничего - просто таблица с данными, её модель, и маппер для её полей - не работает... На кнопке "ок" маппера вызывается "submit()". Повторяю - с SQLite всё работало, тут вдруг перестало както...  Непонимающий
Могу привести код, но он банален.
Код:
    doorsModel = new QSqlTableModel(this);
    doorsModel->setTable("Doors");
    doorsModel->setSort(Door_Id, Qt::AscendingOrder);
    doorsModel->select();

    mapper = new QDataWidgetMapper(this);
    mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
    mapper->setModel(doorsModel);

Также перестали работать функции, такие как вставка строки, удаление записей и тд. Напрмер стал абсолютно неработоспособен код:
Код:
void Doors::delDoor()
{
        QModelIndex index = doorTableView->currentIndex();
        if(!index.isValid())
            return;
        QSqlRecord record = doorModel->record(index.row());
        QString DoorName = record.value(Door_Name).toString();
        int k = QMessageBox::warning(this, tr("Удаление двери"),
                                     tr("Удалить дверь \"%1\" из списка дверей?").arg(DoorName),
                                     QMessageBox::Yes | QMessageBox::No);
        if (k == QMessageBox::No)
        {
            return;
        }
        doorModel->removeRow(index.row());
        doorModel->submitAll();
        doorModel->select();
}

п.с: гуглил...
win 64, qt4.7, mysql 5.0

Подскажите хотябы в какую сторону "копнуть"... а то я уже сутки сижу не втыкаю что он хочет от меня... "Правила" работы со всеми типами БД вроде как одинаковые, и один и тотже код должно работать и с другой БД, тем более они идентичны... не понимаю вообще в чём может быть дело :-(
« Последнее редактирование: Февраль 07, 2011, 03:37 от Terminate » Записан
RVZ
Гость
« Ответ #1 : Февраль 09, 2011, 21:53 »

А где строки типа

Код
C++ (Qt)
mapper->addMapping(ui->NameEdit, doorsModel->fieldIndex("Name"));
 
если за кадром то что там еще осталось?

И наверное тоже присоединюсь к теме... только со своими проблемами.
ни кто случайно не сталкивался с таким приколом
На ворме есть ComboBox и LineEdit
мапятся по такому типу
Код
C++ (Qt)
 
. . .
RTM = new QSqlRelationalTableModel(0);
RTM->setTable("dbo.Ens");
RTM->setEditStrategy(QSqlTableModel::OnManualSubmit);
 
int IDx = RTMen->fieldIndex("ID");
. . .
RTM->setRelation(IDx, QSqlRelation("dbo.Vns", "ID", "Valve"));
. . .
 
RTM->select();
 
ui->ex->setModel(RTM->relationModel(IDx));
ui->ex->setModelColumn(RTM->relationModel(IDx)->fieldIndex("Valve"));
. . .
 
mapper = new QDataWidgetMapper(this);
mapper->setItemDelegate(new QSqlRelationalDelegate(this));
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
mapper->setModel(RTM);
 
mapper->addMapping(ui->Pa, RTM->fieldIndex("Pa")); //LineEdit
mapper->addMapping(ui->ex, IDx); //ComboBox
. . .
mapper->setCurrentIndex(0);
. . .
connect(ui->Save, SIGNAL(clicked()),RTM, SLOT(submitAll()));
 
Ну в общем комбиков и едитов много
Так вот фокус в следующем - вродебы как все нормально переключается вводится и при нажатии кнопки сохраняется в базе НО КАКТО НЕ ПОНЯТНО ЧЕРЕЗ РАЗ если первым переключить комбобокс а после него ввести значение в едит потом нажать Save то данные в базу не попадают(причем даже в модель не попадают(отображал в ТабелВиви))
иными словами последовательность дергания виджетов влияет на возможность сохранения данных

Ну вот .. Помогите кто чем может  Плачущий
Может есть у кого идеии как так могло получится???
Заранее всем спасибо!

P.S. OS Win32(XP) , Qt 4.7.1, DB MSSQL2005
« Последнее редактирование: Февраль 09, 2011, 22:37 от RVZ » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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