Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с QListView
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
kreoss
Здравствуйте, господа.
Изучаю Qt, вот застопорился, прошу помощи)

anec.h
Раскрывающийся текст

#ifndef ANEC_H
#define ANEC_H

#include <QMainWindow>

namespace Ui {
class anec;
}

class QSqlDatabase;
class QSqlTableModel;
class QTableView;

class anec : public QMainWindow
{
    Q_OBJECT


    QSqlDatabase *dbase;
    QSqlTableModel *tModel;
    QSqlTableModel *lModel;

    
public:
    explicit anec(QWidget *parent = 0);
    ~anec();
    
private:
    Ui::anec *ui;
    bool ConnectDB();
};

#endif // ANEC_H



anec.cpp
Раскрывающийся текст

#include "anec.h"
#include "ui_anec.h"

#include <QtGui>
#include <QtSql>


anec::anec(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::anec)
{
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
    ui->setupUi(this);
    ConnectDB();


}

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


bool anec::ConnectDB()
{
    dbase = new QSqlDatabase;
    *dbase = QSqlDatabase::addDatabase("QSQLITE");
    dbase->setHostName("anecdot");
    dbase->setDatabaseName("d:\\Code\\DB\\anecdb.sqlite");
    if(!dbase->open()){
       QMessageBox::critical(0, QObject::tr("Ошибка базы данных"), dbase->lastError().text());
       exit(1);}
    tModel = new QSqlTableModel(this);
    tModel->setTable("anec");
    tModel->select();
    tModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    tModel->setSort(0, Qt::AscendingOrder);
    ui->tableView->setModel(tModel);
    ui->tableView->setColumnHidden(tModel->fieldIndex("id"), true);
    ui->tableView->setColumnHidden(tModel->fieldIndex("id_group"), true);
    ui->tableView->setColumnHidden(tModel->fieldIndex("rating"), true);
    ui->tableView->setColumnHidden(tModel->fieldIndex("id_source"), true);
    ui->tableView->setColumnHidden(tModel->fieldIndex("date_add"), true);
    //ui->tableView->horizontalHeader()->hide();
    ui->tableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
    ui->tableView->show();

    lModel = new QSqlTableModel(this);
    lModel->setTable("group");
    lModel->select();
    lModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    lModel->setSort(0, Qt::AscendingOrder);
    ui->listView->setModel(lModel);
    ui->listView->setModelColumn(1);
}



main.cpp
Раскрывающийся текст

#include <QtGui/QApplication>
#include "anec.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    anec w;
    w.show();

    return a.exec();
}



В tableView все выводится, а вот в listView - ничего не выводить) Что я не так делаю?

Еще заметил, если
    dbase = new QSqlDatabase;
    *dbase = QSqlDatabase::addDatabase("QSQLITE");
    dbase->setHostName("anecdot");
    dbase->setDatabaseName("d:\\Code\\DB\\anecdb.sqlite");
    if(!dbase->open()){
       QMessageBox::critical(0, QObject::tr("Ошибка базы данных"), dbase->lastError().text());
       exit(1);}

вынести в отдельную функцию, то дальнейший код с моделью не работает, т.е. он отрабатывает но в tableView ничего не выводится! Т.е. предположим что я вынес коннект к базе в функцию bool Connect(), а работа с моделью в void modTable(), пишу следующее:
if (!Connect()){
/*какое-то сообщение*/
exit(1);
}
modTable();

По идее должно работать, но tableView остается пустым.
Пытался вывести qDebug()<<tModel->lastError();, но он возвращает QSqlError(-1, "", "") , т.е. то же что и при норм работе.
Соответственно если вызвать новую форму и из нее работать с базой данных надо снова коннектиться. Получается коннект надо повторять при каждом обращении к базе? он не постоянный (т.е. раз подключился при запуске приложения и работаешь пока не закроешь)?
Заранее извиняюсь за ламерские вопросы. :blink: Но я чего-то не понимаю, в этой жизне)
DOGG
Все должно корректно работать (и первый и второй вопрос :) ), собрал ваш проект на своей БД... Проверьте существование таблицы с именем group.
Соединение с базой не нужно постоянно повторять, один раз вы добавили базу и работаете с ней.
kreoss
Цитата(DOGG @ 3.9.2012, 12:45) *
Все должно корректно работать (и первый и второй вопрос :) ), собрал ваш проект на своей БД... Проверьте существование таблицы с именем group.
Соединение с базой не нужно постоянно повторять, один раз вы добавили базу и работаете с ней.


(( блин, а не работает, ни первый, ни 2 вариант. Таблица есть, проверил. Я сразу базу наверстал, внес немного данных, потом уже взялся за приложение. Может Qt кривенько стала?!
Сегодня покопаю еще.
Возник вопрос: А если открыть другую форму (окно), из главной, и от туда работать с некой таблицей, коннект к базе нужно прописывать в новой форме, или может передать текущий коннект, и как?? Или с коннектом во второй вообще ничего не делать?? А просто работать с таблицей через модель!

Я ранее на делфи писал, там с этим никаких проблем) нет. 1коннект раскидываешь на все ДатаСеты (в Фибах) во все окна, а там уж транзакциями рулишь.
DOGG
Вряд ли Qt некорректно установился, прикрепите минимальный собираемый пример вместе с базой, я гляну что там.
Что касается организации работы с БД в Qt - читайте справку (тут она очень удобная и очень много примеров/объяснений прямо в ней) :) в двух словах так:
1. Добавляете базу QSqlDatabase addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )
2. В любом месте программы можете её получить при необходимости QSqlDatabase database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true )
kreoss
Цитата(DOGG @ 3.9.2012, 13:47) *
Вряд ли Qt некорректно установился, прикрепите минимальный собираемый пример вместе с базой, я гляну что там.
Что касается организации работы с БД в Qt - читайте справку (тут она очень удобная и очень много примеров/объяснений прямо в ней) :) в двух словах так:
1. Добавляете базу QSqlDatabase addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )
2. В любом месте программы можете её получить при необходимости QSqlDatabase database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true )

Ок, проверю сегодня, если что, выложу файлы. Кстати, я и по справке первым делом смотрю, а потом уж по гуглу, если не доганяю.
Спасибо за помощь.
kreoss
2 DOGG спасибо за помощь!
Для последующих поколений: я так и не понял почему не работало, перечитав документацию, немного изменил код (правда в других исходниках) и все стало корректно отражаться. Вот пример:

mainform.h
Раскрывающийся текст

#ifndef MAINFORM_H
#define MAINFORM_H

#include <QMainWindow>
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QMessageBox>
#include <kontragent.h>

namespace Ui {
class mainForm;
}

class mainForm : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit mainForm(QWidget *parent = 0);
    ~mainForm();
    
private slots:
    void on_tablePrihod_customContextMenuRequested(const QPoint &pos);

    void on_tableRashod_customContextMenuRequested(const QPoint &pos);

    void on_actionKontragent_triggered();

private:
    Ui::mainForm *ui;
    //QString ico;
    //QString textm;
    void statusHint(QString ico,QString text);
    bool connectDataBase();
    void SelectTablePrihod_v();
    void SelectTableRashod_v();
    void createToolBars();
};

#endif // MAINFORM_H



kontragent.h
Раскрывающийся текст

#ifndef KONTRAGENT_H
#define KONTRAGENT_H

#include <QDialog>
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlTableModel>

namespace Ui {
class kontragent;
}

class kontragent : public QDialog
{
    Q_OBJECT
    
public:
    explicit kontragent(QWidget *parent = 0);
    ~kontragent();
    
private:
    Ui::kontragent *ui;
    void fullTable();
};

#endif // KONTRAGENT_H



main.cpp - не изменялся

mainform.cpp
Раскрывающийся текст

#include "mainform.h"
#include "ui_mainform.h"

mainForm::mainForm(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::mainForm)
{
    QTextCodec *codec = QTextCodec::codecForName("cp1251");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(codec);

    ui->setupUi(this);
    ui->labelStatus->setHidden(true);

    if (!connectDataBase()){
        QMessageBox::critical(this,tr("Ошибка"), tr("Невозможно подключиться к базе данных!"));
        exit(1);
    }
//    statusHint(tr(":/myres/delete-doc"),tr("Проверка"));
    createToolBars();
    SelectTablePrihod_v();
    SelectTableRashod_v();
}

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

bool mainForm::connectDataBase()
{
    QSqlDatabase dbase = QSqlDatabase::addDatabase("QSQLITE");
    dbase.setDatabaseName("d:\\Project_C++\\cosmos\\accm.sqlite");
    return(dbase.open());
    //bool ok = dbase.open();
}

...

void mainForm::SelectTablePrihod_v()
{
    QSqlDatabase dbase = QSqlDatabase::database();

    QSqlTableModel* modelPrihod = new QSqlTableModel(this,dbase);
    modelPrihod->setTable("prihod_v");
    modelPrihod->setEditStrategy(QSqlTableModel::OnManualSubmit);
    modelPrihod->setHeaderData(modelPrihod->fieldIndex("id"),Qt::Horizontal,tr("№"));
    modelPrihod->setHeaderData(modelPrihod->fieldIndex("nomenk_name"),Qt::Horizontal,tr("Номенклуатура"));
    modelPrihod->setHeaderData(modelPrihod->fieldIndex("count"),Qt::Horizontal,tr("Количество"));
    modelPrihod->setHeaderData(modelPrihod->fieldIndex("ediz"),Qt::Horizontal,tr("Ед. изм."));
    modelPrihod->setHeaderData(modelPrihod->fieldIndex("docprih_name"),Qt::Horizontal,tr("Документ"));
    modelPrihod->setHeaderData(modelPrihod->fieldIndex("postav_name"),Qt::Horizontal,tr("Поставщик"));
    modelPrihod->select();
    ui->tablePrihod->setModel(modelPrihod);
    ui->tablePrihod->verticalHeader()->hide();
    ui->tablePrihod->resizeColumnsToContents();
    ui->tablePrihod->setColumnHidden(modelPrihod->fieldIndex("id_nomenk"),true);
    ui->tablePrihod->setColumnHidden(modelPrihod->fieldIndex("id_docprih"),true);
    ui->tablePrihod->setColumnHidden(modelPrihod->fieldIndex("date_add"),true);
    ui->tablePrihod->setColumnHidden(modelPrihod->fieldIndex("status"),true);
    ui->tablePrihod->setColumnHidden(modelPrihod->fieldIndex("id_postav"),true);
    ui->tablePrihod->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);

    ui->tablePrihod->show();

}

void mainForm::SelectTableRashod_v()
{
    QSqlDatabase dbase = QSqlDatabase::database();

    QSqlTableModel* modelRashod = new QSqlTableModel(this,dbase);
    modelRashod->setTable("rashod_v");
    modelRashod->setEditStrategy(QSqlTableModel::OnManualSubmit);
    modelRashod->setHeaderData(modelRashod->fieldIndex("id"),Qt::Horizontal,tr("№"));
    modelRashod->setHeaderData(modelRashod->fieldIndex("nomenk_name"),Qt::Horizontal,tr("Номенклуатура"));
    modelRashod->setHeaderData(modelRashod->fieldIndex("count"),Qt::Horizontal,tr("Количество"));
    modelRashod->setHeaderData(modelRashod->fieldIndex("ediz"),Qt::Horizontal,tr("Ед. изм."));
    modelRashod->setHeaderData(modelRashod->fieldIndex("rashod_prich_name"),Qt::Horizontal,tr("Документ"));
    modelRashod->select();
    ui->tableRashod->setModel(modelRashod);
    ui->tableRashod->verticalHeader()->hide();
    ui->tableRashod->resizeColumnsToContents();
    ui->tableRashod->setColumnHidden(modelRashod->fieldIndex("id_nomenk"),true);
    ui->tableRashod->setColumnHidden(modelRashod->fieldIndex("id_rashod_prich"),true);
    ui->tableRashod->setColumnHidden(modelRashod->fieldIndex("date_add"),true);
    ui->tableRashod->setColumnHidden(modelRashod->fieldIndex("status"),true);
    ui->tableRashod->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);

}

...



kontragent.cpp
Раскрывающийся текст

#include "kontragent.h"
#include "ui_kontragent.h"

kontragent::kontragent(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::kontragent)
{
    ui->setupUi(this);

    fullTable();
}

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

void kontragent::fullTable()
{
    QSqlDatabase dbase = QSqlDatabase::database();

    QSqlTableModel* modelKontragent = new QSqlTableModel(this,dbase);
    modelKontragent->setTable("postav");
    modelKontragent->setEditStrategy(QSqlTableModel::OnManualSubmit);
    modelKontragent->setSort(0, Qt::AscendingOrder);
    modelKontragent->select();
    ui->listKontragent->setModel(modelKontragent);
    ui->listKontragent->setModelColumn(1);
}



Ну и резюме:
Коннект к базе
bool mainForm::connectDataBase()
{
    QSqlDatabase dbase = QSqlDatabase::addDatabase("QSQLITE");
    dbase.setDatabaseName("d:\\Project_C++\\cosmos\\accm.sqlite");
    return(dbase.open());
}

Кстати, почему-то функция корректно возвращает только так return(dbase.open());

Работа с моделью, вывод данных в QTableView
void mainForm::SelectTableRashod_v()
{
    QSqlDatabase dbase = QSqlDatabase::database();

    QSqlTableModel* modelRashod = new QSqlTableModel(this,dbase);
...
}


Работа с моделью, вывод данных в QListView
void kontragent::fullTable()
{
    QSqlDatabase dbase = QSqlDatabase::database();

    QSqlTableModel* modelKontragent = new QSqlTableModel(this,dbase);
...
    ui->listKontragent->setModelColumn(1);
}


При работе с моделью необходимо объязательно указывать базу, по коду понятно как ее получаем. Для начинающих, типа меня)) основные моменты выделил. Удачи. Спасибо за внимание. Тема закрыта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.