[Qt] Logindialog aufrufen
-
Hallo zusammen,
ich habe mich die letzten Tage etwas in Qt eingelesen und will ein paar Testprojekte erstellen.Bei einem Dialog der für das Einlogen in eine MySQL Datenbank zuständig ist habe ich aber ein kleines Problem. (Habe alles ohne Designer/Creator erstellt.)
hier die logindialog.h#ifndef LOGINIALOG_H #define LOGINDIALOG_H #include <QDialog> class QLabel; class QLineEdit; class QPushButton; class LoginDialog : public QDialog { Q_OBJECT //macro das für dialoge mit eigenen objecten nötig ist public: LoginDialog(QWidget *parent = 0); //constructor which tells the parent. default is no parent private slots: bool try_to_connect(); void on_LineEdit_textchanged(); private: //elements that are on the form QLabel *userlabel; QLabel *pwdlabel; QLabel *infolabel; QPushButton *connectButton; QPushButton *closeButton; public: QLineEdit *userlineEdit; QLineEdit *pwdlineEdit; }; #endif
und hier die logindialog.cpp dazu
#include <QtGui> #include <QtSql> #include "logindialog.h" LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent) { //initialize components userlabel = new QLabel(tr("&Username")); userlineEdit = new QLineEdit; userlabel->setBuddy(userlineEdit); pwdlabel = new QLabel(tr("&Password")); pwdlineEdit = new QLineEdit; pwdlineEdit->setEchoMode(QLineEdit::Password); pwdlabel->setBuddy(pwdlineEdit); infolabel = new QLabel(tr("Please enter your username and password")); connectButton = new QPushButton(tr("&Login")); connectButton->setEnabled(false); connectButton->setDefault(true); closeButton = new QPushButton(tr("&Cancel")); //connect components connect(userlineEdit,SIGNAL(textChanged(QString)),this,SLOT(on_LineEdit_textchanged())); connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(connectButton, SIGNAL(clicked()), this, SLOT(try_to_connect())); //create Layouts QVBoxLayout* topMidLayout = new QVBoxLayout; topMidLayout->addWidget(infolabel); topMidLayout->addStretch(); QVBoxLayout* botLeftLayout = new QVBoxLayout; botLeftLayout->addWidget(userlineEdit); botLeftLayout->addWidget(userlabel); QVBoxLayout* midLeftLayout = new QVBoxLayout; midLeftLayout->addLayout(botLeftLayout); midLeftLayout->addStretch(); midLeftLayout->addWidget(connectButton); QVBoxLayout* botRightLayout = new QVBoxLayout; botRightLayout->addWidget(pwdlineEdit); botRightLayout->addWidget(pwdlabel); QVBoxLayout* midRightLayout = new QVBoxLayout; midRightLayout->addLayout(botRightLayout); midRightLayout->addStretch(); midRightLayout->addWidget(closeButton); QHBoxLayout* midLayout = new QHBoxLayout; midLayout->addLayout(midLeftLayout); midLayout->addLayout(midRightLayout); QVBoxLayout* mainLayout = new QVBoxLayout; mainLayout->addLayout(topMidLayout); mainLayout->addLayout(midLayout); setLayout(mainLayout); setWindowTitle(tr("Login")); setFixedHeight(sizeHint().height()); setFixedWidth(sizeHint().width()); setTabOrder(userlineEdit, pwdlineEdit); setTabOrder(connectButton, closeButton); } bool LoginDialog::try_to_connect() { //create databaseconnection QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("Datenbankname"); db.setUserName(userlineEdit->text()); db.setPassword(pwdlineEdit->text()); if (!db.open()) { infolabel->setText("<font color='red'>Error connecting to db</font>"); QMessageBox::critical(0, QObject::tr("Database Error"),db.lastError().text()); return false; } infolabel->setText("<font color='green'>Database connected successfully</font>"); QMessageBox::information(this, tr("Database connected"),tr("Database connected successfully")); return true; } void LoginDialog::on_LineEdit_textchanged(){ if (userlineEdit->text() != "") connectButton->setEnabled(true); else connectButton->setEnabled(false); //return 0; }
Mein Aufruf des Dialogs sieht wie folgt aus:
//mainwindow.h class LoginDialog; private slots: bool login(); //mainwindow.cpp bool MainWindow::login() { if (!loginDialog) { loginDialog = new LoginDialog(this); } loginDialog->exec(); }
So jetzt zu den Fragen
1. Ist es möglich den Dialog aufzurufen, bevor das Hauptfenster erstellt wird und nur wenn die Verbindung funktionier hat das Hauptfenster überhaupt erst zu erstellen? Also mein try_to_connect() slot das Hauptfenster erstellen lasse, bzw einen Parameter an die main sendet und diese dann das Fenster erstellt.
2. Wie übergebe ich meine Verbindungsparameter bzw das QSqlDatabase Objekt an mein Hauptfenster? Habe aus Beispielen und der Doku mehrere Varianten erfolglos getestet^^Vielen Dank für die Hilfe
-
Das mit der Parameterübergabe habe ich gelöst.
Habe einen das ganze über zusätzliche Signals und Slots gelöst. Jetzt bleibt nurnoch das mit dem Hauptfenster erst anzeigen, wenn mein Parameterübergabeslot aufgerufen wird.MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->connectbutton,SIGNAL(clicked()),this,SLOT(login())); } bool MainWindow::login() //login bei buttonclick. soll aber eigentlich im construktor aufgerufen werden und das hauptfenster nicht angezeigt werden { loginDialog = new LoginDialog(this); connect (loginDialog, SIGNAL(connection_success(const QString&,const QString&)), this, SLOT(connect_db(const QString&,const QString&))); loginDialog->exec(); delete loginDialog; return true; } MainWindow::~MainWindow() { delete ui; } void MainWindow::connect_db(const QString& user, const QString& pwd)//slot für parameterübergabe { //QMessageBox::critical(0, QObject::tr("verbindung wird hergestellt"),user); //dummy um zu prüfen ob die übergabe funktioniert ui->userlabel->setText(user); ui->pwdlabel->setText(pwd); }
-
Hat sich erledigt, habe das Problem gefunden.
Hatte vergessen aus der main.cpp dasMainwindow.show();
raus zu nehmen...