Aufrufen eines Passwort-Widgets vor dem Hauptwidget

Alles rund um die Programmierung mit Qt
Antworten
omegano
Beiträge: 21
Registriert: 18. Mai 2012 18:32

Aufrufen eines Passwort-Widgets vor dem Hauptwidget

Beitrag von omegano »

Hallo ich hab ein QT Projekt gestartet klappt auch soweit alles ganz gut. Nun würde ich gerne eine Passwort abfrage vorher einbauen. Das weis ich auch noch wie ich das zu implementieren habe. Allerdings weis ich nicht, wie ich dies dann aufrufe ich mache mal nen Pseudocode wie ich mir das vorstellen würde, vllt kann mir ja jmd ein paar schlagwörter nennen was ich mir daraufhin anlesen sollte um meine Vorstellung realisieren zu können.

Code: Alles auswählen

main(){
pwWidget pww; //Übergibt "irgendwie" ein Flag ob das pw richtig war an main
myMainWidget mainw; // Main startet nur wenn Flag true ist, ansonsten quit
return ...;
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Aufrufen eines Passwort-Widgets vor dem Hauptwidget

Beitrag von franzf »

Das wäre ja ohne Pseudo-Code schneller erklärt gewesen.
Ansonsten bin ich der Auffasssung, dass Dialoge (insbesondere solche, wo man etwas wichtiges bestätigen muss oder wie hier das Passwort abgefragt wird) nicht zusammenhanglos auf dem Desktop aufpoppen sollten. Starte das MainWindow, zeig es an aber ohne Inhalt (+ Menü/Toolbar/... auf disabled). Entweder du zeigst dein Passwort-Fenster jetzt als centralWidget im MainWindow an, oder du machst es am Ende des Konstruktors in einem eigenen SLOT auf, der per QTimer::singleShot() [static] gestartet wird. In allen Fällen sollte das MainWindow sichtbar sein, damit der User auch sieht, wofür er hier gerade sein Passwort hergibt ;)
omegano
Beiträge: 21
Registriert: 18. Mai 2012 18:32

Re: Aufrufen eines Passwort-Widgets vor dem Hauptwidget

Beitrag von omegano »

Ja das hilft mir erstmal sehr weiter, vielen dank :).

Ich schaue mal ob ich mit dem Beispiel alles hinbekomme was ich haben will, ansonsten hol ich dir thread nochma hoch danke :)
omegano
Beiträge: 21
Registriert: 18. Mai 2012 18:32

Re: Aufrufen eines Passwort-Widgets vor dem Hauptwidget

Beitrag von omegano »

Ok also ich hab mir das mal genauer angeguckt. Prinzipiell hatte ich das vorher schon ähnlich, aber ich brauche etwas was den Passwort string mit dem eingegeben vergleicht und das weiterkommen in dem Programm erfolgt nur bei richtigem Passwort. Bei dem Beispiel ist es ähnlich wie bei mir, egal was man eingibt man kommt weiter. Hat jmd ne ahnung wie ich mir ne Funktionbaue die das leistet?

Code: Alles auswählen

Dialog::Dialog(){
    setupUi(this);
    connect( lineEdit, SIGNAL(returnPressed()),
            this, SLOT(checkPW()) );
    connect( buttonBox, SIGNAL(accepted()),
            this, SLOT(checkPW()) );
    connect( buttonBox, SIGNAL(rejected()),
             this, SLOT(reject()) );
}

void Dialog::checkPW(){

    QString pw="ccw";
    if(lineEdit->text()==pw){
        SLOT(accepted());
    }
    else{
        SLOT(rejected());
    }
}
So hab ich es bisher, aber das stimmt ja so nicht...
omegano
Beiträge: 21
Registriert: 18. Mai 2012 18:32

Re: Aufrufen eines Passwort-Widgets vor dem Hauptwidget

Beitrag von omegano »

So habe deine Ratschläge befolgt Fiend.

Jetzt habe ich noch folgende Probleme...
Wenn ich das PW eingebe und Ok drücke... führt er zwar den Slot mit dem PW check aus. Beendet aber das PW Widget nicht. Erst wenn ich Abbrechen drücke Zeigt er das Main Window an, beim richtigen PW ist alles ok. Beim falschen PW Zeigt er nur ein Leeres Fenster an, ich fänds allerdings besser wenn sich das komplette Programm schließt oder erneut der PW dialog aufgerufen wird. Wobei mich das Prob, mit dem Abbrechen drücken am meisten Wurmt. Da muss doch noch irgendwas kommen was nach Ausführen des Slots sagt, Ok dialog ist jetzt zuende fahre im Konstruktor des MainWidgets fort...

Mainform Quellcode & Header:

Code: Alles auswählen

#ifndef MAINFORM_H
#define MAINFORM_H

#include <QtGui>
#include <QString>
#include <QFile>
#include "data.h"
#include "dialog.h"
#include "ui_mainwindow.h"
#define LENGTH 100000

class MForm : public QMainWindow, private Ui::MainWindow {
    Q_OBJECT
public:
    int val;
    Data* myd[LENGTH];
    Dialog* myDialog;
    MForm();
    ~MForm(){}
protected slots:
    void search();
    void save();
    void pw();

private:
    void getDatabase(Data* myd[]);
};

#endif // MAINFORM_H

Code: Alles auswählen

#include "mainForm.h"
#include "dialog.h"
#include "db.h"

MForm::MForm(){
    myDialog = new Dialog;
    myDialog->exec();
    if(myDialog->getFlag()){
    //Gui Initialisieren
    setupUi(this);

    //Daten
    for(int n=0; n<LENGTH; n++){
       myd[n] = NULL;
    }
    getDatabase(myd);


    //connects
    connect( pushButton , SIGNAL(clicked()),
             this , SLOT(search()) );
    connect( lineEdit, SIGNAL(returnPressed()),
             this , SLOT(search()) );
    connect( pushButton_2 , SIGNAL(clicked()),
             this , SLOT(save()) );
    }
    else {
        this->close();
    }
}

void MForm::search(){
    QString str = lineEdit->text();
    QString buf,temp;
    str=str.toLower();
    textEdit->clear();
    for(int i=0 ; i<LENGTH-1 ; i++){
        if(myd[i]!=NULL){
            if((myd[i]->owner.toLower()).indexOf(str)!= -1){
                buf.clear();
                buf=buf.setNum(myd[i]->gala)+":";
                buf+=QString::number(myd[i]->system)+":";
                buf+=QString::number(myd[i]->plani)+" / ";
                buf+="von "+myd[i]->owner+"(Punkte: "+ QString::number(myd[i]->points) +" / AZ: "+QString::number(myd[i]->az)+")";
                buf+=" Planetenname: "+myd[i]->name;
                buf+=" / Allianz: "+myd[i]->alli+"\n";
                temp=textEdit->toPlainText();
                temp.append(buf);
                textEdit->setPlainText(temp);
            }
        }
    }
}

void MForm::save(){
    QString fileName = QFileDialog::getSaveFileName(this, "Bitte eine Datei auswählen",
                                                    QDir::homePath(), "Dokumente (*.txt)");
    QFile file(fileName);
    if (file.open(QIODevice::WriteOnly | QIODevice::Text)){
        file.write(textEdit->toPlainText().toUtf8());
        statusBar()->showMessage(tr("Daten wurden gespeichert!"),5000);
    }
    file.close();
}

void MForm::getDatabase(Data *myd[]){
    QString fileName = "DB.csv";
    QFile file(fileName);
    int n=0;
    
    if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
        QString buf = QString::fromUtf8(file.readLine());
        while(!file.atEnd()&&n<LENGTH) {
            
            //Objekt erzeugen und Datensatz lesen
            myd[n]=new Data();
            buf = QString::fromUtf8(file.readLine());

            // Objekt zusammenbauen
            myd[n]->gala=( (buf.mid(0,( buf.indexOf(";")) ) ).toInt() );
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->system=( (buf.mid(0,( buf.indexOf(";")) ) ).toInt() );
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->plani=( (buf.mid(0,( buf.indexOf(";")) ) ).toInt() );
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->owner=buf.mid(0,( buf.indexOf(";")) ) ;
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->name=buf.mid(0,( buf.indexOf(";")) ) ;
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->points=buf.mid(0,( buf.indexOf(";")) ).toInt() ;
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->alli=buf;
            myd[n]->setAZ();
            n++;
        }
    }
    if(file.error()) {
        QMessageBox::information(0,tr("Error Beim Filelesen!"),tr("blaaaaaaa"));
    }
}

void MForm::pw(){
    val = myDialog->result();
}
Dialog Quellcode & Header:

Code: Alles auswählen

#ifndef DIALOG_H
#define DIALOG_H

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

class Dialog : public QDialog , private Ui::Dialog {
    Q_OBJECT
private:
     bool flag;
     QString pw;
public:
    bool getFlag();
    Dialog();
    ~Dialog(){}
public slots:
    void checkPW();
};

#endif // DIALOG_H

Code: Alles auswählen

#include "dialog.h"
#include "mainForm.h"

Dialog::Dialog(){
    flag=false;
    pw="ccw";
    setupUi(this);
    connect( lineEdit, SIGNAL(returnPressed()),
            this, SLOT(checkPW()) );
    connect( buttonBox, SIGNAL(accepted()),
            this, SLOT(checkPW()) );
    connect( buttonBox, SIGNAL(rejected()),
             this, SLOT(reject()) );
}

void Dialog::checkPW(){
    if(lineEdit->text()==pw){
        flag=true;
    }
    else{
        flag=false;
    }
}

bool Dialog::getFlag(){
    return flag;
}
EDIT: okay das mit dem Ok Button hab ich schonma gefixed, nun kommt nach dem Ok direkt das richtige Widget.

Code: Alles auswählen

    connect( lineEdit, SIGNAL(returnPressed()),
            this, SLOT(checkPW()) );
    connect( lineEdit, SIGNAL(returnPressed()),
             this, SLOT(accept()));
    connect( buttonBox, SIGNAL(accepted()),
            this, SLOT(checkPW()) );
    connect( buttonBox, SIGNAL(accepted()),
             this, SLOT(accept()));
    connect( buttonBox, SIGNAL(rejected()),
             this, SLOT(reject()) );
Ich habe nohc den Slot accept() hinzugefügt, jetzt interessiert mich, ist das so guter Stil? oder gibt es was in meinem Code was ich einfügen kann, das direkt nach dem Check PW slot etwas auslöst das, genau das gleiche wie dieser accept-SLOT bewirkt?
omegano
Beiträge: 21
Registriert: 18. Mai 2012 18:32

Re: Aufrufen eines Passwort-Widgets vor dem Hauptwidget

Beitrag von omegano »

Hat sich alles erledigt, vielen dank :).
Antworten