crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Как отобразить содержимое БД в форме?, в qt Creator почему-то не отображается база в TableView
AnnTenna
  опции профиля:
сообщение 25.2.2010, 14:25
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 25.2.2010
Пользователь №: 1483

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




Репутация:   0  


Здравствуйте, помогите пожалуйста.
Вопрос глупый, извините, с qt столкнулась недавно, поэтому еще не совсем разобралась, и мало чего понятно. :rolleyes:

Мне необходимо каким-нибудь образом отобразить содержимое базы данных(реляционной) прямиком на пользовательский интерфейс, чтоб
содержимое для начала отображалось при нажатии на какую-то кнопку.
Для начала, я порылась в примерах, нашла замечательную реляционную базу данных и на ней решила потренироваться. :pardon: :

Сделала свой проект, перенесла туда все функции с того примера. (пример называется RelationalTableModel)
На мою форму помимо всего прочего добавила кнопку и TableView
Вот моя кнопка:

void sqltwst_fromAnn::on_btBegin_clicked()
{
    if (!createConnection())
        return; // соединение с базой
    createRelationalTables();
// созд таблиц и их заполнение
    QSqlRelationalTableModel model;
   initializeModel(&model);// создание модели по таблице
      //  QTableView *view = ui->tvWagons;
    ui->tvWagons->setModel(&model);
    ui->tvWagons->setItemDelegate(new QSqlRelationalDelegate(this));
    //view->show();

}


Программа компилится, но выдаёт белое полотно вместо таблички базы, сколько бы раз на кнопку ни нажимать.
g_flag:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.2.2010, 15:09
Сообщение #2


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

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

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




Репутация:   94  


Проблема тут
Цитата(AnnTenna @ 25.2.2010, 17:25) *
QSqlRelationalTableModel model;
Ты создала переменную на стеке (как обычную), как только ты выйдешь за область видимости (в данном случае это функция on_btBegin_clicked) так сразу эта переменная будет удалена. Т.е. твоя модель перестанет существовать.



Цитата(AnnTenna @ 25.2.2010, 17:25) *
initializeModel(&model);// создание модели по таблице
такой способ инициализации модели, на мой взгляд не красив. С учётом выше сказанного, лучше сделать так:
QSqlRelationalTableModel *model; // в объявлении класса sqltwst_fromAnn
...
// в функции on_btBegin_clicked
model = createModel();
Т.е. в функции createModel() создавай (с помощью оператора new и не забудь установить ей родителя) и заполняй модель.

Указатель на model лучше описать в объявлении класса, т.к. он потенциально может пригодится в дальнейшем коде

П.С.
посмотрел код примера RelationalTableModel его нужно очень внимательно изучить и понять, что и зачем.
В нём нет такой проблемы как у тебя так как, основные объекты созданы просто в функции main а она завершится только при завершении приложения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AnnTenna
  опции профиля:
сообщение 25.2.2010, 18:25
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 25.2.2010
Пользователь №: 1483

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




Репутация:   0  


Litkevich Yuriy спасибо за точное объяснение :)
Теперь ясно, в чем дело!

Очень жалко, что у меня всё равно не получается.
Теперь ругается на эту строчку:
  QSqlRelationalTableModel * model;


Пишет:
:39: error: ISO C++ forbids declaration of `QSqlRelationalTableModel' with no type :blink:
и еще вот это: :39: error: expected `;' before '*' token
Как будто QSqlRelationalTableModel вообще не считает за тип.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.2.2010, 19:37
Сообщение #4


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

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

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




Репутация:   94  


Цитата(AnnTenna @ 25.2.2010, 21:25) *
Как будто QSqlRelationalTableModel вообще не считает за тип.
А он у тебя где-то описан, #include соответствующий есть с описанием этого типа?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AnnTenna
  опции профиля:
сообщение 25.2.2010, 19:56
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 25.2.2010
Пользователь №: 1483

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




Репутация:   0  


:lol:
Цитата
Как будто QSqlRelationalTableModel вообще не считает за тип.А он у тебя где-то описан, #include соответствующий есть с описанием этого типа?

Точно! Нет. :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AnnTenna
  опции профиля:
сообщение 26.2.2010, 1:43
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 25.2.2010
Пользователь №: 1483

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




Репутация:   0  


Уффф..вроде, более менее разобралась, хоть как-то заработало :morning1:
Не знаю, насколько правильно, но таблица отобразилась как было задумано :)

QSqlRelationalTableModel *createModel() //функция создания модели возвращает созданную модель
{         // создаем модель
   QSqlRelationalTableModel *model = new QSqlRelationalTableModel;
   //! [0]
       model->setTable("employee");
   //! [0]
       /* выдержка из статьи Андрея Боровского:
   //Первым аргументом setRelation() должен быть номер столбца таблицы compositions,
   //содержащего внешний ключ (нумерация столбцов начинается с 0).
   //Вторым параметром метода должна быть ссылка на объект класса QSqlRelation,
   //который мы создаем локально. Первым аргументом конструктора QSqlRelation является
   //имя таблицы, на записи которой ссылается внешний ключ таблицы compositions.
   //Далее следует имя столбца таблицы, на который ссылается внешний ключ,
   //затем имя столбца, которым мы хотим заменить столбец исходной таблицы (compositions),
   //содержащий внешней ключ
         */
       model->setEditStrategy(QSqlTableModel::OnManualSubmit);
   //! [1]
       model->setRelation(2, QSqlRelation("city", "id", "name"));
   //! [1] //! [2]
       model->setRelation(3, QSqlRelation("country", "id", "name"));
   //! [2]

   //! [3]
       model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
       model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
       model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
       model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));
   //! [3]


   model->select();
        qDebug("model");
        return model;

}


Кнопка:
void sqltwst_fromAnn::on_btBegin_clicked()
{

    if (!createConnection())
        return; // соединение с базой

    createRelationalTables();
// созд таблиц и их заполнение
  model = createModel(); // новая собственная функция для инициализации модели

    ui->tvWagons->setModel(model);
    ui->tvWagons->setItemDelegate(new QSqlRelationalDelegate(this));
}


Вот так...
Теперь хотелось бы, чтобы эти таблицы можно было б сохранять и загружать, но, видимо, это уже отдельная тема...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.2.2010, 4:33
Сообщение #7


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

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

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




Репутация:   94  


Цитата(AnnTenna @ 26.2.2010, 4:43) *
Теперь хотелось бы, чтобы эти таблицы можно было б сохранять и загружать, но, видимо, это уже отдельная тема...
да, отдельная тема. Читай её тут
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.10.2021, 0:29