Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Larry от Декабрь 08, 2010, 16:52



Название: модель QSqlTableModel
Отправлено: 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);
}


Название: Re: модель QSqlTableModel
Отправлено: crossly от Декабрь 08, 2010, 17:05
подключение к базе установлено?
добавьте
Код:
qDebug()<<model->lastError().text();
после select() покажите ошибку...

для чего QObject::tr("film")?? ... вы что название таблицы переводить собрались??


Название: Re: модель QSqlTableModel
Отправлено: Larry от Декабрь 08, 2010, 17:18
выдает Unable to find table film.
Попробовал подключить базу в слоте и все заработало...Но я базу подключаю в конструкторе, и вставки нормально проходят в других методах, а здесь не хочет работать пока снова не подключу.
В чем прикол?


Название: Re: модель QSqlTableModel
Отправлено: crossly от Декабрь 08, 2010, 17:38
покажите код


Название: Re: модель QSqlTableModel
Отправлено: Larry от Декабрь 08, 2010, 17:40
весь или какую-то часть?


Название: Re: модель QSqlTableModel
Отправлено: Larry от Декабрь 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();
}
}


Название: Re: модель QSqlTableModel
Отправлено: Larry от Декабрь 08, 2010, 18:21
нашел причину, но не понял природы ее...Убрал в методе createConnection() в строке
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "DiskData");
убрал название соединения "DiskData" и все заработало...Может это кто-то объяснить почему так...


Название: Re: модель QSqlTableModel
Отправлено: Kolobok от Декабрь 08, 2010, 19:10
Если используешь не соединение по умолчанию, нужно его указывать при создании модели. Посмотри описание конструктора QSqlTableModel.


Название: Re: модель QSqlTableModel
Отправлено: Larry от Декабрь 08, 2010, 21:29
спасибо всем кто откликнулся...