Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: EgorRa от Август 01, 2010, 10:23



Название: Помогите новичку разобраться с QTableWidget
Отправлено: EgorRa от Август 01, 2010, 10:23
Пытаюсь научиться работать в QtCreator. Создал проект в Qt с формой mainwindow_ui. На форме создал QTableWidget. Как заполнить её из базы данных?
Я сделал так:
Создал класс
Код:
#ifndef DATABASE_H
#define DATABASE_H

#include <QObject>


class Database : public QObject
{
    Q_OBJECT

public:
    bool OpenConnectDatabase();
    void CloseConnectDatabase();
    void fillTableCourse();
    Database();
};

#endif // DATABASE_H



Описал функции:

Код:
#include "database.h"
#include <QMessageBox>
#include <QTableWidgetItem>
#include <QTableWidget>
#include "ui_mainwindow.h"
#include <QSqlQuery>
#include <QSqlDatabase>


Database::Database()
{

}

bool Database::OpenConnectDatabase()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","connect");
    db.setDatabaseName("newbase.cb");
    db.open();
    if (!db.isOpen())
    {
        QMessageBox msg;
                msg.setText(tr("Ошибка при подключении базы данных"));
                msg.exec();

        return false;
    }
    return true;
}

void Database::CloseConnectDatabase()
{
    QSqlDatabase db= QSqlDatabase::database("connect");
    db.close();
}

void Database::fillTableCourse()
{
    QSqlDatabase db= QSqlDatabase::database("connect");
    QSqlQuery *query= new QSqlQuery(db);

    QTableWidgetItem *item= new QTableWidgetItem;
    QTableWidget *ui_tableWidget=qFindChild<QTableWidget*>(this,"ui_tableWidget");
    query->exec("SELECT one,two FROM tbl1");
    while(query->next()){
        int i=0;
        for(int j=0; j=1; j++) {
            item->setText(query->value(j).toString());
            ui_tableWidget->setItem(i,j,item);
        }
        i++;
    }
}

Создал объект в mainwindow.h

Код:
...
#include <database.h>
...
 Database *database;
...

Вызываю функции в mainwindow.cpp

Код:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    m_ui(new Ui::MainWindow)
{
    m_ui->setupUi(this);
    database->OpenConnectDatabase();
    database->fillTableCourse();

}


База данных вреде бы как подключаеться, а программа завершается с ошибкой

D:\Pro\Test Qt\RaketskyyTest\debug\RaketskyyTest.exe exited with code -1073741819

Ошибка происходить при вызове ui_tableWidget->setItem(i,j,item);


Название: Re: Помогите новичку разобраться с QTableWidget
Отправлено: varkon от Август 01, 2010, 12:28
Во первых, хочу обратить внимание, что QTableWidget не заточен для работы с БД. Более верно использовать связку QTableView+QSqlQueryModel.
Так как ты пытаешься заполнить таблицу - делать нельзя. Надо примерно так:
Код:
    while(query->next()){
        int i=0;
        for(int j=0; j=1; j++) {
             ui_tableWidget->setItem(i,j,new QTableWidgetItem(query->value(j).toString()));
        }
        i++;
    }
Думаю идея понятна.


Название: Re: Помогите новичку разобраться с QTableWidget
Отправлено: lit-uriy от Август 01, 2010, 12:35
EgorRa смотри штатные примеры и документацию.


Название: Re: Помогите новичку разобраться с QTableWidget
Отправлено: EgorRa от Август 23, 2010, 22:48
Спасибо за совет)) помогло) разобрался))
сделал так:
database.cpp
Код:

Database::Database(QTableWidget* tableIncomming): table(tableIncomming)
{

}


void Database::fillTableCourse()
{

    QSqlDatabase db= QSqlDatabase::database("connect");
    QSqlQuery *query= new QSqlQuery(db);
    query->exec("SELECT one,two,three FROM tbl2");
    QTableWidgetItem *pItem = 0;
    int i=0;
    while(query->next())
    {
        for (int j=0;j<getColumnsCount();j++)
        {
            pItem = (table->item(i,j));
            pItem->setText(query->value(j).toString());
        }
        i++;
    }


}


void Database::resizeTable()
{
    QSqlDatabase db= QSqlDatabase::database("connect");
    QSqlQuery *query= new QSqlQuery(db);
    query->exec("SELECT COUNT(*) FROM tbl2");
    query->next();
    setColumnsCount(3);
    setRowsCount(query->value(0).toInt());
    table->setColumnCount(getColumnsCount());
    table->setRowCount(getRowsCount());
    QTableWidgetItem *pItem =0;
    for (int i=0; i<getRowsCount();i++){
        for (int j=0;j<getColumnsCount();j++){
            pItem = new QTableWidgetItem;
            table->setItem(i,j,pItem);
        }
    }
}
mainwindow.cpp

Код:
  QTableWidget* ui_tableWidget = qFindChild<QTableWidget*>(this,"tableWidget");
    Database* database = new Database(ui_tableWidget);
    database->resizeTable();
    database->fillTableCourse();