Russian Qt Forum

Qt => Базы данных => Тема начата: mikh от Июнь 29, 2010, 09:48



Название: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: mikh от Июнь 29, 2010, 09:48
Есть некоторый класс dbase. Соответственно в dbase.ui моя форма(кнопка загрузить таблицу и сама таблица QTableView view). В конструкторе класса подключаюсь к БД в которой находится таблица tabl. И тут возник вопрос, для опытного, я думаю, достаточно простой: как увидеть содержимое таблицы в моей форме? Как сделал я:  в dbase.cpp определил слот load в котором создал модель, загрузил туда данные из БД и соответственно ui->view->setModel(model). В конструкторе приконнектил сигнал нажатия кнопки к слоту load. Программа запускается без проблем и ошибок, но вот view что-то ничего не отображает. Что интересно, если быстро щелкать по кнопке то в таблице что-то улавливается:)

В чем моя ошибка? Заранее спасибо!


Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: crossly от Июнь 29, 2010, 09:51
код покажи...


Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: mikh от Июнь 29, 2010, 10:18
dbase.cpp
Код:
#include "dbase.h"
#include "ui_dbase.h"

dbase::dbase(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::dbase)
{
    ui->setupUi(this);
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setDatabaseName("edb");
    db.setUserName("mikh");
    db.setPassword("111111");
    db.setPort(5444);

    QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(load()));
}

dbase::~dbase()
{
    delete ui;
}

void dbase::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void dbase::load(){
    QSqlTableModel model;
    model.setTable("employee");
    model.select();
    ui->view->setModel(&model);
}


здесь я таблицу назвал employee


Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: crossly от Июнь 29, 2010, 10:27
во первых.... соединение открывать надо....
во вторых.... модель вы создаете на стэке....  при выходе из слота она удаляется....


Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: mikh от Июнь 29, 2010, 10:39
1) а можно подробнее, чтото не оч понял както
2) т.е. объявить гдето вне? или как?


Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: mikh от Июнь 29, 2010, 11:15
изменил следующее:
Код:
#include "dbase.h"
#include "ui_dbase.h"

dbase::dbase(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::dbase)
{
    ui->setupUi(this);
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setDatabaseName("edb");
    db.setUserName("mikh");
    db.setPassword("111111");
    db.setPort(5444);
   
    model = new QSqlTableModel(this);
    model->setTable("employee");
    model->select();

    QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(load()));
}

dbase::~dbase()
{
    delete ui;
}

void dbase::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void dbase::load(){

    ui->view->setModel(model);
}

Я правильно сделал? или можно по грамотней?


Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: crossly от Июнь 29, 2010, 11:52
ну если по логике.... то
Код:
ui->view->setModel(model);
в конструкторе .... а select() в load()....


Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: lit-uriy от Июнь 29, 2010, 15:46
>>1) а можно подробнее, чтото не оч понял както
Код
C++ (Qt)
if(!db.open()){
// обработать ошибку
}


Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: mikh от Июнь 29, 2010, 20:15
на самом деле чтото не въезжаю  ???
Код:
#include "dbase.h"
#include "ui_dbase.h"

dbase::dbase(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::dbase)
{
    ui->setupUi(this);
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setDatabaseName("edb");
    db.setUserName("mikh");
    db.setPassword("111111");
    db.setPort(5444);
    model = new QSqlTableModel(this);

    if (!db.open()) {
        QMessageBox::information(this,"Error",db.lastError().text(),QMessageBox::Ok);
    }
    else {
        model->setTable("employee");
        ui->view->setModel(model);
    }
    QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(load()));
}

dbase::~dbase() {
    delete ui;
}

void dbase::changeEvent(QEvent *e) {
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void dbase::load(){
    model->select();
}

не могли бы объяснить что происходит при
Код:
 model->setTable("employee"); 
,
Код:
 model->select(); 
и
Код:
 ui->view->setModel(model); 

Читал описание этих функции, но ничего вразумительного не нашел.
Попробовал записывать их в разных местах, ничего интересного не увидел.
Откровенно скажу, пока слабоват в таких моментах. что и где должно быть.





Название: Re: Проблема с загрузкой таблицы из базы данных или дело в непонимании
Отправлено: lit-uriy от Июнь 29, 2010, 21:16
>>model->setTable("employee");
устанавливает таблицу, с которой будет работать модель (при этом модель проверяет - есть ли в БД такая таблица)

>>model->select();
модель делает примерно следующее
SELECT * FROM <тут имя таблицы установленной в предыдущем методе>
и полученными данными заполняет свою внутреннюю структуру, посылает всем заинтересованным объектам (например, представлениям) сигнал о том, что данные в модели изменились

>>ui->view->setModel(model);
устанавливает модель для этого представления, т.е. представление будет отображать данные из заданной модели.