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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с загрузкой таблицы из базы данных или дело в непонимании  (Прочитано 4286 раз)
mikh
Гость
« : Июнь 29, 2010, 09:48 »

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

В чем моя ошибка? Заранее спасибо!
Записан
crossly
Гость
« Ответ #1 : Июнь 29, 2010, 09:51 »

код покажи...
Записан
mikh
Гость
« Ответ #2 : Июнь 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
« Последнее редактирование: Июнь 29, 2010, 10:21 от mikh » Записан
crossly
Гость
« Ответ #3 : Июнь 29, 2010, 10:27 »

во первых.... соединение открывать надо....
во вторых.... модель вы создаете на стэке....  при выходе из слота она удаляется....
Записан
mikh
Гость
« Ответ #4 : Июнь 29, 2010, 10:39 »

1) а можно подробнее, чтото не оч понял както
2) т.е. объявить гдето вне? или как?
Записан
mikh
Гость
« Ответ #5 : Июнь 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);
}

Я правильно сделал? или можно по грамотней?
Записан
crossly
Гость
« Ответ #6 : Июнь 29, 2010, 11:52 »

ну если по логике.... то
Код:
ui->view->setModel(model);
в конструкторе .... а select() в load()....
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июнь 29, 2010, 15:46 »

>>1) а можно подробнее, чтото не оч понял както
Код
C++ (Qt)
if(!db.open()){
// обработать ошибку
}
Записан

Юра.
mikh
Гость
« Ответ #8 : Июнь 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); 

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



Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июнь 29, 2010, 21:16 »

>>model->setTable("employee");
устанавливает таблицу, с которой будет работать модель (при этом модель проверяет - есть ли в БД такая таблица)

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

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

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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