Приветствую.
Я здесь новенький. Хотя читаю форум и сайт постоянно, решил зарегаться только сейчас.
Не бейте палками, знаю, что тема избитая, но мне нужна помощь. Долгие чтения статей на trolltech.com, на этом форуме/сайте мне не помогли.
Пишу диплом на QT, параллельно изучая ее.
Итак проблема.
Код:
#include <QtGui>
#include <QtSql>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );
db.setDatabaseName( "dbname" );
db.setUserName( "root" );
db.setPassword("pass");
db.setHostName( "localhost" );
db.open();
if (!db.open())
{
QMessageBox::warning( 0 , "Error! Not connect to base", db.lastError().databaseText());
}
QSqlTableModel model;// = new QSqlTableModel;
QTableView *view = new QTableView;
QString str = "tereptab";
view->setModel(&model);
model.setTable(str);
model.select();
view->show();
app.exec();
return 0;
[b]main.cpp[/b]
#include <QtGui>
#include <QtSql>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow *mw = new MainWindow();
mw->setGeometry(200,200,640,480);
mw->show();
app.setStyle(new QPlastiqueStyle);
app.exec();
return 0;
}
//---------------------------------------------------
[b]mainwindow.cpp[/b]
#include "mainwindow.h"
//#include "ui_mainwindow.h"
#include <QtSql>
MainWindow::MainWindow()
{
mainWidget = new QWidget();
lay = new QVBoxLayout;
butCon = new QPushButton(tr("Connect"));
connect(butCon, SIGNAL(clicked()), this, SLOT(slotCon()));
lay->addWidget(butCon);
mainWidget->setLayout(lay);
setCentralWidget(mainWidget);
}
MainWindow::~MainWindow()
{
}
void MainWindow::slotCon()
{
QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );
db.setDatabaseName( "terep" );
db.setUserName( "root" );
db.setPassword("vertrigo");
db.setHostName( "localhost" );
db.open();
if (!db.open())
{
QMessageBox::warning( 0 , "Error! Not connect to base", db.lastError().databaseText());
}
QSqlTableModel model;// = new QSqlTableModel;
QTableView *view = new QTableView;
QString str = "tereptab";
view->setModel(&model);
model.setTable(str);
model.select();
view->show();
setCentralWidget(view);
}
//---------------------------------------------------
[b]mainwindow.h[/b]
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QtGui>
#include <QtSql>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow();
~MainWindow();
QPushButton *butCon;
QVBoxLayout *lay;
QWidget *mainWidget;
private slots:
void slotCon();
};
#endif // MAINWINDOW_H
void MainWindow::slotCon()
{
QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );
db.setDatabaseName( "terep" );
db.setUserName( "root" );
db.setPassword("vertrigo");
db.setHostName( "localhost" );
db.open(); // ??? Хватит и одного open
if (!db.open()) // ???
{
QMessageBox::warning( 0 , "Error! Not connect to base", db.lastError().databaseText());
}
QSqlTableModel model;// = new QSqlTableModel; // <<<<<<< Что произойдет с объектом model после выхода из slotCon?
QTableView *view = new QTableView;
QString str = "tereptab";
view->setModel(&model);
model.setTable(str);
model.select();
view->show();
setCentralWidget(view);
}
Сделал так:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QtGui>
#include <QtSql>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow();
~MainWindow();
QPushButton *butCon;
QVBoxLayout *lay;
QWidget *mainWidget;
QSqlTableModel *model;
private slots:
void slotCon();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QtSql>
MainWindow::MainWindow()
{
mainWidget = new QWidget();
model = new QSqlTableModel;
lay = new QVBoxLayout;
butCon = new QPushButton(tr("Connect"));
connect(butCon, SIGNAL(clicked()), this, SLOT(slotCon()));
lay->addWidget(butCon);
mainWidget->setLayout(lay);
setCentralWidget(mainWidget);
}
MainWindow::~MainWindow()
{
}
void MainWindow::slotCon()
{
QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );
db.setDatabaseName( "terep" );
db.setUserName( "root" );
db.setPassword("vertrigo");
db.setHostName( "localhost" );
if (!db.open())
{
QMessageBox::warning( 0 , "Error! Not connect to base", db.lastError().databaseText());
}
QTableView *view = new QTableView;
QString str = "tereptab";
view->setModel(model);
model->setTable(str);
model->select();
view->show();
setCentralWidget(view);
}
Объект QSqlTableModel нужно создавать после открытия базы данных, но создавать его нужно на куче.
QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );
db.setDatabaseName( "terep" );
db.setUserName( "root" );
db.setPassword("vertrigo");
db.setHostName( "localhost" );
if (!db.open())
{
QMessageBox::warning( 0 , "Error! Not connect to base", db.lastError().databaseText());
}
model = new QSqlTableModel;
QTableView *view = new QTableView;
QString str = "employee";
view->setModel(model);
model->setTable(str);
model->select();
QMessageBox::warning( 0 , "Error! Not connect to base", model->lastError().text());
view->show();
view->showGrid();
setCentralWidget(view);
Попробуй вначале настраивать модель (setTable, select), а потом указать ее view. Хотя модель во время select должна сама уведомить view.
Точно таблица не пустая?
К сожалению, уже много раз пробовал и так и сяк.
В данный момент :
db = QSqlDatabase::addDatabase( "QMYSQL" );
db.setDatabaseName( "terep" );
db.setUserName( "root" );
db.setPassword("vertrigo");
db.setHostName( "localhost" );
if (!db.open())
{
QMessageBox::warning( 0 , "Error! Not connect to base", db.lastError().databaseText());
}
model = new QSqlTableModel;
QString str = "tereptab";
model->setTable(str);
model->select();
view = new QTableView;
view->setModel(model);
view->show();
setCentralWidget(view);
MainWindow::~MainWindow()
{
db.close();
db.removeDatabase(db.connectionName());
}
В данный момент:
#include "mainwindow.h"
#include <QtSql>
MainWindow::MainWindow()
{
mainWidget = new QWidget();
lay = new QVBoxLayout;
butCon = new QPushButton(tr("Connect"));
connect(butCon, SIGNAL(clicked()), this, SLOT(slotCon()));
lay->addWidget(butCon);
mainWidget->setLayout(lay);
setCentralWidget(mainWidget);
}
MainWindow::~MainWindow()
{
db.close();
QSqlDatabase::removeDatabase("QMYSQL");
delete(lay);
delete(butCon);
model->clear();
delete(model);
delete(view);
}
void MainWindow::slotCon()
{
db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName( "terep" );
db.setUserName( "root" );
db.setPassword("vertrigo");
db.setHostName( "localhost" );
if (!db.open())
{
QMessageBox::warning( 0 , "Error! Not connect to base", db.lastError().databaseText());
}
model = new QSqlTableModel;
QString str = "tereptab";
model->setTable(str);
model->select();
view = new QTableView;
view->setModel(model);
view->show();
setCentralWidget(view);
}
И еще, может кто подскажет почему вот от этого:
QString str = "employee";
model->setTable(str);
model->setTable("employee");
model->select();
Как то странно.
Названия таблиц дергает, схему показывает, а при двойном клике по таблице рушится и семерка начинает искать причину падения...
На любой таблице такая реакция
Под Дебианом работает
Кинулся скорее добивать диплом под ним.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)