Название: Непонятки с авторизацией кБД Отправлено: 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... Посмотрел примеры по документации , но ничем они мне не помогли... Подскажите как правильно сделать авторизацию пользователей? Название: Re: Непонятки с авторизацией кБД Отправлено: Majestio от Июнь 10, 2013, 14:58 Я бы предложил другой вариант. Сделать авторизацию сперва без диалога, просто в основной форме, без интерактива. Повесить подключение/авторизацию по кнопочке, после каждого сомнительного оператора выводить отладку по qDebug() << "Переменная:" << yourVar;
Посмотреть как все проходит. После этого уже наворачивать диалоги, передачи параметров и пр. И еще совет - смысл гонять по экземплярам классов хэндл базы, коль он объявлен отдельно? ИМХО имеет смысл создать myglobal.h и в нем прописать: "external QSqlDatabase db;", этот заголовок включать во все остальные классы. |