crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Подключение БД к QSqlTableModel
Гость_DaniMinch_*
сообщение 23.2.2014, 10:40
Сообщение #1





Гости








    


Всем привет. Необходимо сделать программу, в ходе которой данные из разных таблиц одной БД раскидываются по вкладкам QTabWidget. Для этого создан класс Database в котором подключается БД MS access, и теоретически изменяется таблица в модели. Однако, методом проб и ошибок я выяснил, что представления не имею как подключить модель к Бд. Я недавно начал работать с Qt и С++, поэтому подключение конструктором представляет для меня некоторые сложности, так как все мои попытки его сформировать приводили к тьме ошибок. Код класса, main, и функции смены вкладок прилагаются.
Database.h
class Database
{
public:
    Database(QString Driver, QString ConnectionString);
    QSqlTableModel model;//Источник!!!
    QSqlDatabase db;
    void setModelTable(QString tablename);

private:
    bool setDataBase(QString Driver, QString ConnectionString);
    bool connected;
};

Database.cpp
Database::Database(QString Driver, QString ConnectionString)
{
    if(!setDataBase(Driver, ConnectionString))
    {
        //...
    }
}

bool Database::setDataBase(QString Driver, QString ConnectionString)
{
    db = QSqlDatabase::addDatabase(Driver);
    db.setDatabaseName(ConnectionString);
    if (!db.open())
    {
        if (db.lastError().isValid())
            qDebug() << db.lastError();
        return false;
    }
    else
    {
        qDebug() << "success";
        QSqlTableModel arr;
        pmodel=&arr;
        return true;
    }
}

void Database::setModelTable(QString tablename)
{
    model->setTable(tablename);
    model->select();
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
}

Функция
void TheatreWindow::on_tabWidget_currentChanged(int index)
{

    switch(index)
    {
        case 1:
            db->setModelTable("TimeTable");
            ui->tableViewShedule->setModel(&db->model);
            break;
        case 2:
            db->setModelTable("Plays");
            ui->tableViewPlays->setModel(&db->model);
            break;
        case 3:
            db->setModelTable("Tickets");
            break;
        case 4:
            db->setModelTable("Clients");
            ui->tableViewClients->setModel(&db->model);
            break;
        case 5:
            db->setModelTable("Halls");
            ui->tableViewHalls->setModel(&db->model);
            break;
        case 6:
            db->setModelTable("Halls");
            ui->tableViewDestroy->setModel(&db->model);
            break;
        case 7:
            db->setModelTable("Users");
            ui->tableViewUsers->setModel(&db->model);
            break;
        case 8:
            db->setModelTable("Users");
            ui->tableViewUsersAdmin->setModel(&db->model);
            break;
    default:
        qDebug() <<"Something wrong. Tab index: "<<index;
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.2.2014, 22:50
Сообщение #2


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

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

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




Репутация:   94  


Цитата(Гость_DaniMinch_* @ 23.2.2014, 12:40) *
Для этого создан класс Database
Класс этот стоит выкинуть или переименовать или переделать, ... т.к. возникает смысловая коллизия с названием штатного класса - QSqlDatabase.

Модель у тебя объявлена на стеке:
QSqlTableModel model;
А используется почему-то как указатель на модель:
model->setTable(tablename);


Тебе достаточно объявить указатель на модель в классе TheatreWindow.
QSqlTableModel *model;

В конструкторе этого класса инициализировать указатель на модель:
QSqlDatabase db = QSqlDatabase::addDatabase(Driver);
db.foo(); // Некие настройки соединения с БД
...
model = new QSqlTableModel(this /*, db */); // можно не указывать БД, если используется соединение по умолчанию
model->setTable(tablename);
model->select();


П.С.
Т.к. пользователь будет переключатся между вкладками, то тебе лучше завести столько моделей, сколько таблиц ты хочешь отображать. Это сразу съест некоторое кол-во памяти (для хранения данных модели), но не будет тратиться время на загрузку данных в единственную модель всякий раз при переключении вкладок.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_DaniMinch_*
сообщение 24.2.2014, 15:17
Сообщение #3





Гости








    


Litkevich Yuriy,
спасибо, вроде все понял. Класс удалил, перенес создание базы данных в конструктор TheatreWindow. Установку моделей и таблиц оставил в функции смене вкладок. Однако, я не уверен, что имеет смысл создавать множество моделей. Будут разделены права доступа к программе и доступ ко всем вкладкам будет лишь у одного пользователя. Остальным бужет доступна лишь пара-тройка различных. К тому же задержка вроде бы не заметна.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 1:14