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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите новичку разобраться с QTableWidget  (Прочитано 6775 раз)
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);
« Последнее редактирование: Август 01, 2010, 12:14 от EgorRa » Записан
varkon
Гость
« Ответ #1 : Август 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++;
    }
Думаю идея понятна.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Август 01, 2010, 12:35 »

EgorRa смотри штатные примеры и документацию.
Записан

Юра.
EgorRa
Гость
« Ответ #3 : Август 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();
« Последнее редактирование: Август 23, 2010, 22:52 от EgorRa » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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