Datensatz suchen



  • Habe mir über Sqlite eine Lokal Datenbank erstellt. Lese und schreibe über ein Qt Programm Datensätze ein und aus und kann Sie einzelnen verändern. Dies wollte ich erweitern und nach einen Datensatz suchen. Erst habe ich nach einen Festgelegt Datensatz gesucht über den Nachnamen.
    Dazu rufe ich über eine Instanz einen Konstruktor auf.

    void MainWindow::on_buttonKundeSuche_clicked()
    {
    
        //wenn eine Verbindung zu Datenbank besteht
        if (dbVerbunden == true)
        {
            //den Dialog anzeigen
            Suchliste *formSuchliste = new Suchliste();
            formSuchliste->show();
    
       }
    Und lasse mir den Datensatz in einer Liste anzeigen.
    
    Suchliste::Suchliste()
    {
        //if (ok && !text.isEmpty()) {
           //QString sqlAbfrage = "nachname = '" + Hans + "'";
            //das Modell erstellen
            QSqlTableModel *modell = new QSqlTableModel(this);
            //die Tabelle setzen
            modell->setTable("kunden");
            modell->setFilter("nachname = 'Hans'");
            //modell->setFilter(sqlAbfrage);
            setWindowTitle("Suchanzeige Kunden");
            //die Texte für die Spaltenköpfe setzen
            modell->setHeaderData(0, Qt::Horizontal, "ID");
            modell->setHeaderData(1, Qt::Horizontal, "Vorname");
            modell->setHeaderData(2, Qt::Horizontal, "Name");
            modell->setHeaderData(3, Qt::Horizontal, "Strasse");
            modell->setHeaderData(4, Qt::Horizontal, "PLZ");
            modell->setHeaderData(5, Qt::Horizontal, "Ort");
            modell->setHeaderData(6, Qt::Horizontal, "Telefon");
    
            //die Daten beschaffen
            modell->select();
    
             //die TableView erstellen
             QTableView *ansicht = new QTableView(this);
             //mit dem Modell verbinden
             ansicht->setModel(modell);
             //die Breite der Spalten an den Inhalt anpassen
             ansicht->resizeColumnsToContents();
             //die Größe setzen
             ansicht->resize(500,300);
    }
    
    Das Funktioniert auch
    Jetzt wollte die Suche erweitern über ein QInputDialog, die suche funktioniert auch über das QInputDialog.
    Suchliste::Suchliste()
    {
    
    bool ok = false;
    
    QString text = QInputDialog::getText(0, "Datensatz Suchen","Bitte Nachname Eingeben:", QLineEdit::Normal,"", &ok);
    
    if (ok && !text.isEmpty()) {
           QString sqlAbfrage = "nachname = '" + text + "'";
            //das Modell erstellen
            QSqlTableModel *modell = new QSqlTableModel(this);
            //die Tabelle setzen
            modell->setTable("kunden");
           // modell->setFilter("nachname = 'Hans'");
            modell->setFilter(sqlAbfrage);
            setWindowTitle("Suchanzeige Kunden");
            //die Texte für die Spaltenköpfe setzen
            modell->setHeaderData(0, Qt::Horizontal, "ID");
            modell->setHeaderData(1, Qt::Horizontal, "Vorname");
            modell->setHeaderData(2, Qt::Horizontal, "Name");
            modell->setHeaderData(3, Qt::Horizontal, "Strasse");
            modell->setHeaderData(4, Qt::Horizontal, "PLZ");
            modell->setHeaderData(5, Qt::Horizontal, "Ort");
            modell->setHeaderData(6, Qt::Horizontal, "Telefon");
    
            //die Daten beschaffen
            modell->select();
    
             //die TableView erstellen
             QTableView *ansicht = new QTableView(this);
             //mit dem Modell verbinden
             ansicht->setModel(modell);
             //die Breite der Spalten an den Inhalt anpassen
             ansicht->resizeColumnsToContents();
             //die Größe setzen
             ansicht->resize(500,300);
    }
    }
    nur wenn ich auf Channel drücke wird mir ein neues Fenster geöffnet. Habe schon versucht das Fenster mit close() zu schließen. 
    
    


  • @M-W sagte in Datensatz suchen:

    nur wenn ich auf Channel drücke wird mir ein neues Fenster geöffnet. Habe schon versucht das Fenster mit close() zu schließen.

    Ich verstehe die Frage nicht. Ich finde kein Channel auf das du clicken könntest in deinem Code Ausschnitt.



  • @M-W: Du solltest deinen Beitrag auch besser formatieren, so daß man deine weiteren Sätze nicht erst im Code entdecken muß (kannst du auch noch nachträglich über das Menü mit den 3 Punkten -> "Bearbeiten")!



  • Bitte entschuldigt meine Formatierung und Fragestellung werden mir mehr mühe geben. Kurz zur Erklärung, habe mir über Sqlite einen Datensatz über die Eingabeaufforderung angelegt, über Qt eine grafische Oberfläche teileweis im Designer kriert oder im Code. Auf der Grafischen Oberfläche sind mehrere Schaltflächen wo ich einen Datensatz anlegen kann, Einzellern abfragen kann oder mir alle Datensätze anzeigen lassen kann. Jetzt habe mir ein weitere schalfläche erstellt womit ich einen Datensatz suchen möchte. Um nach einen bestimmten Datensatz zu suchen mache ich diese über ein QInputDialog, es öffnet sich ein Eingabefeld um den Nachnamen ein zu geben und ein OK und Channel, Button gebe ich einen Namen ein und drücke ich den Ok Button öffnet sich der gesuchte Datensatz.

    Betätige ich den Channel Button sollte sich das Eingabefeld schließen und ich mir die erste Grafische Oberfläche anzeigen um erneut den Button suchen zu betätigen. Doch es schiebt sich ein weiteres Fenster vor diese Grafische Oberfläche. Alles ob mir über die Instanz und show() close() unwirksam gemacht wird.

    //die Slots
    void MainWindow::on_buttonKundeSuche_clicked()
    {
    
        //wenn eine Verbindung zu Datenbank besteht
        if (dbVerbunden == true)
        {
            //den Dialog anzeigen
            Suchliste *formSuchliste = new Suchliste();
            formSuchliste->show();
    
       }
    
    
    }
    
    //der Konstruktor
    //er erstellt den kompletten Inhalt
    Suchliste::Suchliste()
    {
    
    bool ok = false;
    
    QString text = QInputDialog::getText(0, "Datensatz Suchen","Bitte Nachname Eingeben:", QLineEdit::Normal,"", &ok);
    
    if (ok && !text.isEmpty()) {
           QString sqlAbfrage = "nachname = '" + text + "'";
            //das Modell erstellen
            QSqlTableModel *modell = new QSqlTableModel(this);
            //die Tabelle setzen
            modell->setTable("kunden");
           // modell->setFilter("nachname = 'Hans'");
            modell->setFilter(sqlAbfrage);
            setWindowTitle("Suchanzeige Kunden");
            //die Texte für die Spaltenköpfe setzen
            modell->setHeaderData(0, Qt::Horizontal, "ID");
            modell->setHeaderData(1, Qt::Horizontal, "Vorname");
            modell->setHeaderData(2, Qt::Horizontal, "Name");
            modell->setHeaderData(3, Qt::Horizontal, "Strasse");
            modell->setHeaderData(4, Qt::Horizontal, "PLZ");
            modell->setHeaderData(5, Qt::Horizontal, "Ort");
            modell->setHeaderData(6, Qt::Horizontal, "Telefon");
    
            //die Daten beschaffen
            modell->select();
    
             //die TableView erstellen
             QTableView *ansicht = new QTableView(this);
             //mit dem Modell verbinden
             ansicht->setModel(modell);
             //die Breite der Spalten an den Inhalt anpassen
             ansicht->resizeColumnsToContents();
             //die Größe setzen
             ansicht->resize(500,300);
    }
    else{
    
             this->close();
    
    }
    }
    
    


  • @M-W Du meinst einen "Cancel" Button...

    Wenn ich grade die QT Doku richtig verstehe, würde man normalerweise QInputDialog::getText ein Pointer auf ein Parent Widget mitgeben.
    Bei QT bin ich mir nicht sicher, ob ein Modal Dialog unbedingt einen Parent braucht um sauber aufgeräumt zu werden.

    Erbt Suchliste von einer QT Klasse?
    oder, wie ist

    formSuchliste->show();
    

    implementiert?
    So wie es da steht, hast du an der Stelle auch einen Memonry Leak, weil Suchliste nirgends wieder gelöscht wird

    So wie ich das sehe, erstellt der Konstruktor von Suchliste den QInputDialog. Wenn der beendet wird, wird formSuchliste->show();aufgerufen und wieder was angezeigt.



  • Hallo Schlangenmensch danke für deine Antwort,
    das ist richtig was du schreibst, " wenn beendet wird, wird fromsuchliste->show(); ausgerufen und wieder was angezeigt. Die Klasse Suchliste erbt von Dialog.

     Klasse erbt von QDialog
    class Suchliste : public QDialog
    

    Aber ich habe was angepasst den QInputDialog mache ich jetzt in der MainWondows Klasse.

    void MainWindow::on_buttonKundeSuche_clicked()
    {
    bool ok = false;
        //wenn eine Verbindung zu Datenbank besteht
        if (dbVerbunden == true)
        {
         QString text = QInputDialog::getText(0, "Datensatz Suchen","Bitte Nachname Eingeben:", QLineEdit::Normal,"", &ok);
         if (ok && !text.isEmpty()) {
             //den Dialog anzeigen
              Suchliste *formSuchliste = new Suchliste();
              formSuchliste->show();
          }else{
              Suchliste *formSuchliste = new Suchliste();
              formSuchliste->close();
         }
    
    
       }
    
    
    }
    

    Jetzt muss ich nur noch das Attribute vom QString an die andere Klasse übergebe, ich weiß nicht genau ob ich das mit einen Pointer mache oder mit deinjer Membervariablen der Klasse A, dann einen Memberfunktion, die den Wert der Membervariablen zurückgibt



  • Wie sieht denn die Slot-Methode vom "Channel"-Button aus?

    Du hast aber ein generelles logisches Problem:
    du zeigst im Konstruktor von Suchliste den QInputDialog an und möchtest bei "Abbrechen" oder leerem Text die Suchliste-Form wieder schließen. Da du jedoch erst danach show() aufrufst, wird dann in jedem Fall ein leeres Formular angezeigt.

    Mach daraus eine eigene Methode (mit bool als Rückgabewert):

    Suchliste *formSuchliste = new Suchliste();
    if (formSuchliste->ShowInputDialog())
        formSuchliste->show();
    

    PS: Dein Beitrag ist (evtl. aufgrund mangelnder Deutschkenntnisse?) schlecht zu lesen. Meinst du statt "Channel" evtl. "Abbrechen" - also "Cancel" im englischen?



  • Ja ich meine Cancel für Abbrechen sorry. Der Cancel Button wird automatisch mit generiert, wenn das QInputDialog erstellt wird.



  • @M-W Dein else Zweig ergibt doch keinen Sinn, Dialog erstellen und direkt wieder schließen. Oder hab ich was verpasst. Außerdem übergibst du immer noch keinen Parent.

    @M-W sagte in Datensatz suchen:

    Jetzt muss ich nur noch das Attribute vom QString an die andere Klasse übergebe, ich weiß nicht genau ob ich das mit einen Pointer mache oder mit deinjer Membervariablen der Klasse A, dann einen Memberfunktion, die den Wert der Membervariablen zurückgibt

    Hier weiß ich wieder nicht, was du genau meinst. Wenn du den String text an Suchliste übergeben willst, kannst du dem Konstruktor einfach einen Parameter verpassen.

    @Th69 Wenn ich die Doku zu QInputDialog::getText grade richtig überflogen habe, hat der Dialog automatisch einen "ok" und einen "cancel" Button. Wenn "Cancel" geklickt wird, wird ok auf false gesetzt.



  • Ja das mit den else zweig habe ich dann auch gemerkt das es kein sinn macht.



  • @Schlangenmensch: ich weiß leider nicht, was du mir sagen willst. ;- )



  • Aber es handelt sich doch um zweit unterschiedliche Klassen, in der Klasse A wird QLinDialog abgefragt und in einer QString Variable der Nachname gespeichert. In der Klasse B befindet sich die Suchliste.
    Ich muss doch jetzt die QString Variable von Klasse A mit dem Nachnamen an Klasse B mit de Suchliste übergeben.



  • @M-W Dann mach das doch



  • Es hat geklappt, ich übergebe einfach die Instanz über den Konstruktor der anderen Klasse!

     Suchliste *formSuchliste = new Suchliste(text);
    

Log in to reply