Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Отображение данных в tableView из БД.

Автор: potkin 30.7.2010, 11:47

Есть код:

    QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE");
    db.setHostName(ui->lEHostName->text());
    db.setDatabaseName(ui->lEDatabaseName->text());
    db.setUserName(ui->lEUserName->text());
    db.setPassword(ui->lEPasswor->text());

    if(db.open())
    {
        QSqlTableModel model = new QSqlTableModel(this, db);
        model.setTable("table1");
        model.setHeaderData(0, Qt::Horizontal, "id"); // .setHeaderData(0, Qt::Horizontal, “id”);
        model.setHeaderData(1, Qt::Horizontal, "firstname");
        model.setHeaderData(1, Qt::Horizontal, "lastname");
        model.select();
        ui->tableView->setModel(&model);
        ui->tableView->resizeColumnsToContents();

        db.close();
    }
    else
    {
         QMessageBox::warning(0 , "Error !", db.lastError().databaseText());
    }


на строке "QSqlTableModel model = new QSqlTableModel(this, db);" выдаёт ошибку:
C:/Qt/2010.02.1/qt/FireBird_1/mainwindow.cpp:49: error: conversion from 'QSqlTableModel*' to non-scalar type 'QSqlTableModel' requested


В нете примеры есть, но они также не работают, например один из них
...
QSqlTableModel model = new QSqlTableModel(this); // Тут к БД model не привязана ни как, да и не работает код всё равно :(
...


Подскажите что не так ?

Автор: BRE 30.7.2010, 11:55

model->

вместо

model.

Автор: potkin 30.7.2010, 11:59

Спасибо !!!
+ надо было так:

QSqlTableModel *model;
        model = new QSqlTableModel(this, db);

а не так:
QSqlTableModel model = new QSqlTableModel(this, db);

как в примерах :blink:

Автор: Алексей1153 30.7.2010, 12:39

potkin, если это не просто опечатка была, то срочно открывай книжку по C++ - читай про указатели :)

Автор: potkin 30.7.2010, 15:19

Алексей1153,
Мой путь:
Delphi 1-2005 + Builder -> MVS 2005-2008 (.NET 2.0-3.5, C#) -> C++ (Qt)
C++ не знаю, только счас изучаю.

Автор: Алексей1153 30.7.2010, 18:41

potkin, неважен путь (а в Дельфи чай тоже указатели используются) , это же основы. Ну так то да, шарп у тебя был лишний - он расхолаживает, ну а C++ сам по себе с Qt не связан, это самостоятельный язык.

В шарпе имеется различие на структурные типы и ссылочные. Первые можно создавать на стеке, вторые - только в куче, а запись вида

A a= new A(...);


объявлет ссылку "a" типа "A" (а ссылка - это абсолютно полный аналог указателя, что бы там не пищал компилятор :D ) и ей присваивается адрес созданногов куче объекта типа A. Если про ссылку (читай - указатель) "забыть", то в шарпе утечка памяти произойдёт тоже, но "ненадолго" - сборщик рано или поздно подчистит.

А в C++ всё проще - надо чётко говорить, где должна создаться переменная - на стеке или в куче. Оператор new всегда создаёт в куче и возвращает указатель. А выражение в некой функции:

A a(...);


- создаёт переменную на стеке (так же и параметры функций тоже в стеке сидят).

Если размер тела объекта оказется больше стека, объект при создани на стеке заставит программу экстренно завершиться - из-за переполнения стека.

Например
BYTE Array1[0xffffff];// - нельзя так создавать на стеке
BYTE* Array2=new BYTE[0xffffff];// зато в куче можно


вот как-то так :)

Автор: potkin 30.7.2010, 19:02

Цитата
... то в шарпе утечка памяти произойдёт тоже, но "ненадолго" - сборщик рано или поздно подчистит.

Вот чем мне нраивлся .NET :)
Хорошо всё продумали Мелкосовцы.
Жаль, что под Линуксом (МОНО) крупный проект хрен нормально будет работать :( . Почему и на Qt заставили съехать.

Автор: Алексей1153 30.7.2010, 19:28

Цитата(potkin @ 30.7.2010, 22:02) *
Вот чем мне нраивлся .NET

Странно, а мне этот момент как раз резко противен :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)