[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 das

    Mainwindow.show();
    

    raus zu nehmen...


Anmelden zum Antworten