Russian Qt Forum

Программирование => С/C++ => Тема начата: vexar от Февраль 08, 2010, 09:45



Название: Глобальные переменные
Отправлено: vexar от Февраль 08, 2010, 09:45
Подскажите как сделать переменную глобальной?
Вот есть у меня фаил
mysql.h

Код:
#ifndef MYSQL_H
#define MYSQL_H

#include <QtSql>

bool connect_mysql()
  {
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("baza");
    db.setUserName("login");
    db.setPassword("passwd");

    if (!db.open())
        {
                qDebug() << QObject::trUtf8("Не смогла я открыть базу данных") << db.lastError();
                return false;
        }
    return true;
}
#endif // MYSQL_H

Этот фаил инклюдится в
main.cpp

Код:
#include <QtGui>
#include "mainwindow.h"
#include "mysql.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    connect_mysql();

    MainWindow window;
    window.show();

    return app.exec();
}
Как сделать чтобы в файле mainwindow.cpp можно было вызвать db?

Код:
void MainWindow::createStatusBar()
{
    if(!db.open())
    {
     statusBar()->showMessage(trUtf8("Соединение установлено!"));
    }
    else
    {
        statusBar()->showMessage(trUtf8("Соединение не утановлено!"));
    }
}


Название: Re: Глобальные переменные
Отправлено: Akaiten от Февраль 08, 2010, 09:59
В mysql.h написать (и соответственно убрать объявление db из connect_mysql()):
Код
C++ (Qt)
extern QSqlDatabase db;
 

а в main.cpp:
Код
C++ (Qt)
QSqlDatabase db;
 


Название: Re: Глобальные переменные
Отправлено: MoPDoBoPoT от Февраль 08, 2010, 11:38
В этом нет никакой необходимости, после установления соединения методом QSqlDatabase::addDatabase его можно "вытащить" (получить) через статический метод QSqlDatabase::database().


Название: Re: Глобальные переменные
Отправлено: vexar от Февраль 08, 2010, 18:39
В этом нет никакой необходимости, после установления соединения методом QSqlDatabase::addDatabase его можно "вытащить" (получить) через статический метод QSqlDatabase::database().

А пример можно? А то я себе слабо представляю как это будет выглядеть.


Название: Re: Глобальные переменные
Отправлено: break от Февраль 08, 2010, 18:43
Цитировать
А пример можно? А то я себе слабо представляю как это будет выглядеть.
вам правильно сказали QSqlDatabase это Value-Based класс он не является сущностью (то есть это не класс самой БД в программе), а лишь переменная содержащая параметры этой самой БД, которая кешируется в недрах Qt. В большинстве случаев QSqlDatabase и вспоминать не надо (что очень удобно) - соединение по умолчанию для всех QSqlQuery и т.д. вернет нужную БД. По поводу примера - на этом форуме уже обсуждалось не раз, да и в справке хорошо написано!


Название: Re: Глобальные переменные
Отправлено: BRE от Февраль 08, 2010, 18:46
А пример можно? А то я себе слабо представляю как это будет выглядеть.
В assistant все написано.
Где нибудь открыли базу:
Код
C++ (Qt)
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("acidalia");
    db.setDatabaseName("customdb");
    db.setUserName("mojito");
    db.setPassword("J0a1m8");
    bool ok = db.open();
 

В любом другом месту:
Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::database();
 

При открытии можно именовать подключения и соответственно получать их по имени:
QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )   [static]
QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true )   [static]


Название: Re: Глобальные переменные
Отправлено: break от Февраль 08, 2010, 18:50
Еще здесь http://www.prog.org.ru/index.php?topic=10014.msg61002#msg61002


Название: Re: Глобальные переменные
Отправлено: vexar от Февраль 09, 2010, 02:09
Спасибо всем. Разобрался. Работает )


Название: Re: Глобальные переменные
Отправлено: vexar от Февраль 10, 2010, 08:27
А как быть с QueryOnline.next() ?
Есть mainwindow из которого вызывается диалоговое окно, в котором предлагается ввести Login и Pass.

Код:
dialog.cpp
void LoginSysDialog::AddCharLine()
{
    QString strName = LineEditName->text();
    QString strPass = LineEditPass->text();

    QSqlQuery QueryOnline;
    QueryOnline.exec( "SELECT * FROM users WHERE login='"+strName+"' AND password='"+strPass+"'" );

}
Код:
mainwindow.cpp

MainWindow::MainWindow()
{
     if(QueryOnline.next())
       {
          qDebug () << trUtf8("Работает...!");
        }
     else
       {
          qDebug () << trUtf8("Не работает...!");
        }
}


Название: Re: Глобальные переменные
Отправлено: break от Февраль 10, 2010, 12:07
Это уже отдельная тема не имеющая отношения к БД - организация передачи данных между окошками...
Можно передавать Query из окошка в окошко - но я бы сделал так чтобы в окне авторизации происходила вся работа, или окно авторизации возвращало ХЕШ или имя+пароль главному окну вкотором происходит проверка. А то получается у вас 1 логика будет растянута на 2 окна. В общем loginWindow пусть или отдает главному окну то что ввел пользователь или уже готовый результат правильно ли он ввел...