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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: модель QSqlTableModel  (Прочитано 4264 раз)
Larry
Гость
« : Декабрь 08, 2010, 16:52 »

Добрый день!Возникла такая проблема,..я создал класс-наследник от QWidget и в нем создал QTableView, а в одном из слотов пытаюсь подключить модель QSqlTableView, но при выборке из базы ничего не отображается...Подскажите, где может быть проблема...
Слот:
Код:
void widget::slotShowRecord()
{
QSqlTableModel* model = new QSqlTableModel();

model->setTable(QObject::tr("film"));
model->select();

m_DbView->setModel(model);
}
Записан
crossly
Гость
« Ответ #1 : Декабрь 08, 2010, 17:05 »

подключение к базе установлено?
добавьте
Код:
qDebug()<<model->lastError().text();
после select() покажите ошибку...

для чего QObject::tr("film")?? ... вы что название таблицы переводить собрались??
Записан
Larry
Гость
« Ответ #2 : Декабрь 08, 2010, 17:18 »

выдает Unable to find table film.
Попробовал подключить базу в слоте и все заработало...Но я базу подключаю в конструкторе, и вставки нормально проходят в других методах, а здесь не хочет работать пока снова не подключу.
В чем прикол?
« Последнее редактирование: Декабрь 08, 2010, 17:20 от Larry » Записан
crossly
Гость
« Ответ #3 : Декабрь 08, 2010, 17:38 »

покажите код
Записан
Larry
Гость
« Ответ #4 : Декабрь 08, 2010, 17:40 »

весь или какую-то часть?
Записан
Larry
Гость
« Ответ #5 : Декабрь 08, 2010, 17:58 »

Код:
#include "widget.h"
/////////////////////////////////////////////////////////////////////////
widget::widget(QWidget* pWgt): QWidget(pWgt)
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("cp1251"));

QPushButton* pCrButton = new QPushButton(QObject::tr("Создать"));
QPushButton* pDpButton = new QPushButton(QObject::tr("Показать"));

connect(pCrButton, SIGNAL(clicked()), this, SLOT(slotCreateRecord()));
connect(pDpButton, SIGNAL(clicked()), this, SLOT(slotShowRecord()));

m_nameFilm  = new QLineEdit;
m_nameCarr  = new QComboBox;
m_nameGenre = new QComboBox;
m_DbView    = new QTableView;

QLabel* pTextFilm  = new QLabel(QObject::tr("Название"));
QLabel* pTextCarr  = new QLabel(QObject::tr("Носитель"));
QLabel* pTextGenre = new QLabel(QObject::tr("Жанр"));

pTextFilm->setAlignment(Qt::AlignCenter);
pTextCarr->setAlignment(Qt::AlignCenter);
pTextGenre->setAlignment(Qt::AlignCenter);

QVBoxLayout* pVMain    = new QVBoxLayout();
QVBoxLayout* pVLtFilm  = new QVBoxLayout();
QVBoxLayout* pVLtGenre = new QVBoxLayout();
QVBoxLayout* pVLtCarr  = new QVBoxLayout();

QHBoxLayout* pHLtData = new QHBoxLayout();
QHBoxLayout* pHLtButt = new QHBoxLayout();

pVLtFilm->addWidget(pTextFilm);
pVLtFilm->addWidget(m_nameFilm);

pVLtGenre->addWidget(pTextGenre);
pVLtGenre->addWidget(m_nameGenre);

pVLtCarr->addWidget(pTextCarr);
pVLtCarr->addWidget(m_nameCarr);

pHLtData->addLayout(pVLtFilm);
pHLtData->addLayout(pVLtGenre);
pHLtData->addLayout(pVLtCarr);

pHLtButt->addWidget(pCrButton);
pHLtButt->addWidget(pDpButton);

pVMain->addLayout(pHLtData);
pVMain->addLayout(pHLtButt);
pVMain->addWidget(m_DbView);

setLayout(pVMain);

readTextFile(QObject::tr("настройки/жанры.txt"), m_nameGenre);
readTextFile(QObject::tr("настройки/носители.txt"), m_nameCarr);

createConnection();
createTable();
}
//--------------------------------------------------------------------
bool widget::createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "DiskData");

db.setDatabaseName(QObject::tr("DiskDb"));

if(!db.open())
{
qDebug() << "Can't a database";
return false;
}
else
qDebug() << "Create a DB";

return true;
}
//--------------------------------------------------------------------
void widget::createTable()
{
QSqlDatabase db = QSqlDatabase::database("DiskData");
QSqlQuery query(db);

QString str = "CREATE TABLE film(id INTEGER PRIMARY KEY NOT NULL, "
  "name VARCHAR(50) UNIQUE,"
  "genre VARCHAR(20),"
  "carrier VARCHAR(15))";

if(!query.exec(str))
qDebug() << "Can't create a table";
else
qDebug() << "create a table";
}
//--------------------------------------------------------------------
void widget::slotCreateRecord()
{
QSqlDatabase db = QSqlDatabase::database("DiskData");
QSqlQuery query(db);

QString strF = "INSERT INTO film(name, genre, carrier) "
   "VALUES('%1', '%2', '%3')";

QString str = strF.arg(m_nameFilm->text())
  .arg(m_nameGenre->currentText())
  .arg(m_nameCarr->currentText());

if(!query.exec(str))
qDebug() << "Data not record in a table";
else
qDebug() << "Data record in a table";


}
//--------------------------------------------------------------------
void widget::slotShowRecord()
{
QSqlTableModel* model = new QSqlTableModel();

model->setTable(QObject::tr("film"));
model->select();

qDebug()<<model->lastError().text();

m_DbView->setModel(model);
m_DbView->show();
}
//--------------------------------------------------------------------
void widget::readTextFile(QString nameFile, QComboBox* pComboBox)
{
QFile file(nameFile);

if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
qDebug() << QObject::tr("Невозможно открыть файл");
else
{
qDebug() << QObject::tr("Файл открыт");

QTextStream in(&file);
QString line = "";

while(!in.atEnd())
{
line = in.readLine();
pComboBox->addItem(line);
}

file.close();
}
}
Записан
Larry
Гость
« Ответ #6 : Декабрь 08, 2010, 18:21 »

нашел причину, но не понял природы ее...Убрал в методе createConnection() в строке
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "DiskData");
убрал название соединения "DiskData" и все заработало...Может это кто-то объяснить почему так...
Записан
Kolobok
Гость
« Ответ #7 : Декабрь 08, 2010, 19:10 »

Если используешь не соединение по умолчанию, нужно его указывать при создании модели. Посмотри описание конструктора QSqlTableModel.
Записан
Larry
Гость
« Ответ #8 : Декабрь 08, 2010, 21:29 »

спасибо всем кто откликнулся...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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