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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Глобальные переменные  (Прочитано 6232 раз)
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("Соединение не утановлено!"));
    }
}
Записан
Akaiten
Гость
« Ответ #1 : Февраль 08, 2010, 09:59 »

В mysql.h написать (и соответственно убрать объявление db из connect_mysql()):
Код
C++ (Qt)
extern QSqlDatabase db;
 

а в main.cpp:
Код
C++ (Qt)
QSqlDatabase db;
 
Записан
MoPDoBoPoT
Гость
« Ответ #2 : Февраль 08, 2010, 11:38 »

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

В этом нет никакой необходимости, после установления соединения методом QSqlDatabase::addDatabase его можно "вытащить" (получить) через статический метод QSqlDatabase::database().

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

Сообщений: 846


Просмотр профиля
« Ответ #4 : Февраль 08, 2010, 18:43 »

Цитировать
А пример можно? А то я себе слабо представляю как это будет выглядеть.
вам правильно сказали QSqlDatabase это Value-Based класс он не является сущностью (то есть это не класс самой БД в программе), а лишь переменная содержащая параметры этой самой БД, которая кешируется в недрах Qt. В большинстве случаев QSqlDatabase и вспоминать не надо (что очень удобно) - соединение по умолчанию для всех QSqlQuery и т.д. вернет нужную БД. По поводу примера - на этом форуме уже обсуждалось не раз, да и в справке хорошо написано!
Записан
BRE
Гость
« Ответ #5 : Февраль 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]
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Февраль 08, 2010, 18:50 »

Еще здесь http://www.prog.org.ru/index.php?topic=10014.msg61002#msg61002
Записан
vexar
Гость
« Ответ #7 : Февраль 09, 2010, 02:09 »

Спасибо всем. Разобрался. Работает )
Записан
vexar
Гость
« Ответ #8 : Февраль 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("Не работает...!");
        }
}
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #9 : Февраль 10, 2010, 12:07 »

Это уже отдельная тема не имеющая отношения к БД - организация передачи данных между окошками...
Можно передавать Query из окошка в окошко - но я бы сделал так чтобы в окне авторизации происходила вся работа, или окно авторизации возвращало ХЕШ или имя+пароль главному окну вкотором происходит проверка. А то получается у вас 1 логика будет растянута на 2 окна. В общем loginWindow пусть или отдает главному окну то что ввел пользователь или уже готовый результат правильно ли он ввел...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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