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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятки с авторизацией кБД  (Прочитано 1941 раз)
zharkov1977
Гость
« : Июнь 10, 2013, 14:31 »

При запуске приложения - выходит форма с авторизацией...

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QtSql/QSqlDatabase>
#include <QTextCodec>
#include "forms/login.h"

QSqlDatabase db;
void initTextCodecs(const char *codecName)
{
    QTextCodec *codec = QTextCodec::codecForName(codecName);
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForTr(codec);
}
int main(int argc, char *argv[])
{
    initTextCodecs("CP-1251");
    QApplication a(argc, argv);
    Login login(&db);
    if(login.exec() != QDialog::Accepted)
    {
        return 0;
    }
    MainWindow w(db.database());
    w.setWindowFlags(Qt::Window);
    w.setWindowState(w.windowState() | Qt::WindowMaximized);
    w.show();
    return a.exec();
}


login.h

#include <QDialog>
#include <QtSql/QSqlDatabase>
#include <QLineEdit>

class Login : public QDialog
{
    Q_OBJECT
public:
    explicit Login(QSqlDatabase* db,QWidget *parent = 0);
signals: 
public slots:
    void loginSlot();
    void cancelSlot();
   
private:
    QPushButton* loginButton;
    QPushButton* cancelButton;
    QLineEdit *nameDatabase;
    QLineEdit *nameUser;
    QLineEdit *passwordUser;
    int         try_;

private:
    QSqlDatabase* db_;


login.cpp


#include "login.h"
#include <QtGui>

Login::Login(QSqlDatabase* db, QWidget *parent) :
    db_(db),
    try_(0),
    QDialog(parent)
{
    *db_ = QSqlDatabase::addDatabase("QODBC");

    setWindowTitle(tr("Вход в систему"));

    loginButton = new QPushButton(tr("Логин"));
    connect(loginButton, SIGNAL(clicked()), this, SLOT(loginSlot()));
    cancelButton = new QPushButton(tr("Отмена"));
    connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelSlot()));
    QVBoxLayout *ButtonLayout = new QVBoxLayout;
    ButtonLayout->addStretch();
    ButtonLayout->addWidget(loginButton);
    ButtonLayout->addWidget(cancelButton);
    ButtonLayout->addStretch();
    QLabel *nameDatabaseLabel = new QLabel(tr("База данных:"));
    nameDatabase = new QLineEdit();
    QLabel *nameUserLabel = new QLabel(tr("Имя:"));
    nameUser = new QLineEdit();
    QLabel *passwordUserLabel = new QLabel(tr("Пароль:"));
    passwordUser = new QLineEdit();

    QVBoxLayout *LabelLayout = new QVBoxLayout;
    LabelLayout->addWidget(nameDatabaseLabel);
    LabelLayout->addWidget(nameUserLabel);
    LabelLayout->addWidget(passwordUserLabel);

    QVBoxLayout *LineLayout = new QVBoxLayout;
    LineLayout->addWidget(nameDatabase);
    LineLayout->addWidget(nameUser);
    LineLayout->addWidget(passwordUser);
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(LabelLayout);
    mainLayout->addLayout(LineLayout);
    mainLayout->addLayout(ButtonLayout);
    setLayout(mainLayout);
    this->resize(300,150);
}

void Login::loginSlot()
{
     db_->setDatabaseName(nameDatabase->text());
     db_->setUserName(nameUser->text());
     db_->setPassword(passwordUser->text());
    if(!db_->open())
    {
        try_++;

        if(try_ == 3)
            this->reject();
        nameDatabase->clear();
        nameUser->clear();
        passwordUser->clear();
    }
    else
    {
        this->accept();
    }
}

void Login::cancelSlot()
{
    this->reject();
}


Настроен драйвер PostgreSQL Unicode ODBC   в системе .

при запуске если указать только setDatabaseName - база данных открыта и доступна,

если указывать кроме этого и пароль - то db.open возвращает false...

Посмотрел примеры по документации , но ничем они мне не помогли...
Подскажите как правильно сделать авторизацию пользователей?
Записан
Majestio
Гость
« Ответ #1 : Июнь 10, 2013, 14:58 »

Я бы предложил другой вариант. Сделать авторизацию сперва без диалога, просто в основной форме, без интерактива. Повесить подключение/авторизацию по кнопочке, после каждого сомнительного оператора выводить отладку по qDebug() << "Переменная:" << yourVar;

Посмотреть как все проходит. После этого уже наворачивать диалоги, передачи параметров и пр. И еще совет - смысл гонять по экземплярам классов хэндл базы, коль он объявлен отдельно? ИМХО имеет смысл создать myglobal.h и в нем прописать: "external QSqlDatabase db;", этот заголовок включать во все остальные классы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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