Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание собственного класса и переменные 
V
    Опции темы
dmitrio
Дата 15.9.2011, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Создаю собственный информационный класс который будет отвечать за работу с базами данных.
Наследую от QWidget (хотя не знаю правильно или нет, потому что класс несет только информацию):
dbclass.h
Код

#include "gconst.h"
#include <QtSql>
#include <QString>
#include <QWidget>
class dbclass: public QWidget
{
    Q_OBJECT

public:
    dbclass(QWidget *parent=0);
    bool opendatabase() const;
    QString DBLastError() const;
    QString readDBData() const;

private:
    QSqlDatabase *database;
    QSqlQuery *query;
    QString *text;
};

dbclass.cpp
Код

#include "databasefunc.h"

dbclass::dbclass(QWidget *parent)
    : QWidget(parent)
{
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE", "dbconnection");
    database.setDatabaseName(pathdb);
}

bool dbclass::opendatabase() const
{
    QSqlDatabase database = QSqlDatabase::database("dbconnection"); ///<<<-----Если это убрать и ниже вместо database.open() поставить database->open() при запуске получаем SIGSEGV
    if (!database.open())
        return false;
    else
        return true;
}
QString dbclass::DBLastError() const
{
    QSqlDatabase database = QSqlDatabase::database("dbconnection"); ///<<<-----Если это убрать и ниже вместо database.lastError() поставить database->lastError() при запуске получаем SIGSEGV
    return database.lastError().text();
}
QString dbclass::readDBData() const
{
    QSqlDatabase database = QSqlDatabase::database("dbconnection"); ///<<<-----Если это убрать при запуске получаем SIGSEGV
    QString text;
    QSqlQuery query(database);
    query.exec("SELECT id from users");
    while (query.next())
    {
        text = query.value(0).toString();
    }
    return text;
}

Если из методов убрать QSqlDatabase database = QSqlDatabase::database("dbconnection"); то программа сегфолтится.
Почему так происходит??
Я немного догадываюсь, что это все из-за того что я до сих пор не читал Страуструпа. Но вот только что его скачал и начинаю читать.
Может кто-нибудь опередит меня и подскажет
PM MAIL   Вверх
math64
Дата 15.9.2011, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Ты не проинициализировал в конструкторе поля database, query, text, поэтому и не можешь использовать их в методах.
Добавь так же деструктор.
Если не нужен функционал Widget, но нужны сигналы/слоты - наследуйся от QObject.
Если не нужны и сигналы/слоты - не наследуйся ни от чего.

PM   Вверх
borisbn
Дата 15.9.2011, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



И в итоге (если я правильно понял) должно быть как-то так

dbclass.h
Код

#include "gconst.h" // Это я не знаю зачем, но оставил
#include <QtSql>
#include <QString>

class dbclass
{
    Q_OBJECT

public:
    dbclass();
    bool opendatabase();
    QString DBLastError() const;
    QString readDBData();

private:
    QSqlDatabase database;
//    QSqlQuery query;
//    QString text;
};

dbclass.cpp
Код

#include "databasefunc.h" // Это я не знаю зачем, но оставил
#include "dbclass.h"

dbclass::dbclass()
{
    database = QSqlDatabase::addDatabase("QSQLITE", "dbconnection");
    database.setDatabaseName(pathdb);
}

bool dbclass::opendatabase()
{
    if ( !database.open() )
        return false;
    else
        return true;
}

QString dbclass::DBLastError() const
{
    return database.lastError().text();
}

QString dbclass::readDBData()
{
    QString text;
    QSqlQuery query( database );
    query.exec("SELECT id from users");
    while ( query.next() )
    {
        text = query.value(0).toString(); // ??? см. замечание ниже
    }
    return text;
}

ф-ция readDBData() несколько странная - в цикле вычитываются id-шники, но каждый раз перезаписываются в одну и ту же переменную. В итоге ты вернёшь последний id...

Это сообщение отредактировал(а) borisbn - 15.9.2011, 08:42


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
dmitrio
Дата 15.9.2011, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Спасибо 
На счет странности смешно )))))
Это я так просто чтобы прочитать что-нить в БД. Там пока только одна запись где id=1
Если на экране увидел 1 значит все работает, эт я так проверял ))))

Вопрос:
Почему так:
Код

if( !database.open() )
...

а не так:
Код

if(!database.open())

???
Я просто делал всегда как во втором варианте

в include gconst.h
содержится три глобальных константы
1) Номер версии программы
2) Путь к БД
3) Директория к БД
Пока подумал что именно они в качестве глобальных ничего страшного не сделают, хотя слышал что глобальность зло

Это сообщение отредактировал(а) dmitrio - 15.9.2011, 09:43
PM MAIL   Вверх
borisbn
Дата 15.9.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(dmitrio @  15.9.2011,  09:38 Найти цитируемый пост)
Вопрос:
Почему так:
Код
if( !database.open() )
...

а не так:
Код
if(!database.open())

???

это ж просто пробелы... не люблю, когда символы сливаются. иногда трудно найти ошибку. ещё лучше так
Код
if ( ! database.open() )

Цитата(dmitrio @  15.9.2011,  09:38 Найти цитируемый пост)
хотя слышал что глобальность зло

 smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
dmitrio
Дата 15.9.2011, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



При изменении на все вышесказанное компилятор стал ругаться:
Код

../one/dbclass.h:10: Error: Class contains Q_OBJECT macro but does not inherit from QObject

10-я строка это макрос: 
Код

    Q_OBJECT


P.S добавляю в объявление класса dbclass наследование от QWidget компилятор ругаться перестает

Ну наверное напоследок еще пару своих нужных вопросов:
1-ый вопрос:
Код

    database = QSqlDatabase::addDatabase("QSQLITE", "dbconnection");

Код

    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE", "dbconnection");

Какая разница между этими двумя строками?
Я себе купил книгу Qt4 программирование GUI на C++ Жасмин Бланшет Марк Саммерфилд
Многое делал по нему, и там как раз описывается второй вариант.
Конечно вопрос наверное более по C++, ну я думаю к концу этой недели прочитаю Страуструпа

2-ой вопрос:
Совсем запутался в объявлении переменных в классе
Почему какие-то инициализируются как указатели
Код

....
    QHBoxLayout *hlayout1;
    QHBoxLayout *hlayout2;
    QLabel *labelName;
    QLabel *labelNameError;
    QLabel *labelPasError;
....

Это просто пример, опять же все делалось по книге Бланшета
Тут надо так:
Код

    QSqlDatabase database;

3-ий вопрос
Переменные в методах не требуют объявлений в классе?
Код

    QString text;
    QSqlQuery query(database);

Извиняюсь если мои вопросы кажутся больно глупыми и простыми. 

Это сообщение отредактировал(а) dmitrio - 15.9.2011, 11:53
PM MAIL   Вверх
math64
Дата 15.9.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Если не наследуешься от QObject или QWidget, строку Q_OBJECT нужно убрать, если наследуешься - она нужна.
PM   Вверх
borisbn
Дата 15.9.2011, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(dmitrio @  15.9.2011,  11:26 Найти цитируемый пост)
Class contains Q_OBJECT macro but does not inherit from QObject

ага. забыл убрать. просто удали и всё. наследоваться от QWidget не нужно
Цитата(dmitrio @  15.9.2011,  11:26 Найти цитируемый пост)
Какая разница между этими двумя строками?

Второй вариант это объявление и инициализация переменной внутри функции. "Жить" этой переменной до конца функции. В других функциях эта переменная не будет доступна.
Первый вариант - это инициализация (вернее, просто присвоение щначения) переменной-члена класса.
Цитата(dmitrio @  15.9.2011,  11:26 Найти цитируемый пост)
Почему какие-то инициализируются как указатели

Не инициализируются, а объявляются....
Совет: не начинай с Qt. Изучи сначала основы Си++: переменные, функции, указатели, ссылки, классы, конструкторы/деструкторы и т.п.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
dmitrio
Дата 15.9.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Всем спасибо за подсказки.
Да действительно перепутал слова инициализация и объявление, чет всегда их путаю

Почему-то охота сразу с Qt разбираться, надеюсь что у меня все получиться
Еще раз всем спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.