Название: модель 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
спасибо всем кто откликнулся...
|