QString vergleich

Alles rund um die Programmierung mit Qt
Antworten
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

QString vergleich

Beitrag von mugi »

Hallo,

ich entwickle gerade ein Adressbuch mit Hilfe von Qt. Wenn der User ein Name als neuer Kontakt eingibt möchte ich eine Liste einblenden, die Namen Vorschläge über schon existierenden Kontakte beinhaltet. z.B gibt der User der Name "Adrian", so müssen auch die Namen "Edrian", "Addriian", "Adrien"... angezeigt werden falls diese in die Kontakte schon existieren. So möchte ich eine Legitime Tipp Fehler ausschließen und doppel Namen vermeiden.
Im klar Text möchte ich eine "prozentuale String-Übereinstimmung" implementieren. Kann Qt sowas machen, bzw. wie kann ich das am besten implementieren ?

Vielen Dank im Voraus

mugi
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: QString vergleich

Beitrag von Marcus Breuer »

Hi,

ich meine, dass das mit einem QLineEdit möglich ist. Du kannst dort einen QCompleter setzen, der direkt während der Eingabe "Treffer/Vorschläge" anzeigt:

Den Completer müsstest Du dann über diese Methode so einstellen können, dass er deinen Wünschen entspricht:
http://doc.qt.nokia.com/4.7-snapshot/qc ... ivity-prop

Probiere es mal aus. Ich denke, dass es so klappen könnte.

Hier kurz ein Beispielcode:

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStringList>
#include <QCompleter>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QStringList Names;
    Names << "Edrian" << "Addriian" << "Adrien";

    QCompleter *Completer = new QCompleter(Names);
    Completer->setCaseSensitivity(Qt::CaseInsensitive);

    ui->lineEdit->setCompleter(Completer);
}

MainWindow::~MainWindow()
{
    delete ui;
}

Hier wäre noch eine alternative Möglichkeit, jedes Mal, wenn der Text in einem QLineEdit geändert wurde, einen eigenen Slot aufzurufen, der direkt den Inhalt überprüft. Allerdings ist die Laufzeit sicherlich nicht gerade optimal.

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStringList>
#include <QCompleter>

QStringList Names;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    Names << "Edrian" << "Addriian" << "Adrien";


    /*** Alternative 1 ***/
//    QCompleter *Completer = new QCompleter(Names);
//    Completer->setCaseSensitivity(Qt::CaseInsensitive);
//    ui->lineEdit->setCompleter(Completer);
    /*** Ende Alternative 1 ***/

    /*** Alternative 2 ***/
    connect(ui->lineEdit, SIGNAL(textEdited(QString)),
            this, SLOT(showString(QString)));
}

void MainWindow::showString(QString str)
{
    ui->textEdit->clear();
    for(int i=0; i<Names.length(); ++i)
    {
        if(Names.at(i).contains(str))
            ui->textEdit->append(Names.at(i));
        else continue;
    }
}
/*** Ende Alternative 2 ***/

MainWindow::~MainWindow()
{
    delete ui;
}
Beste Grüße,
Marcus
mugi
Beiträge: 30
Registriert: 7. Juli 2011 18:12

Re: QString vergleich

Beitrag von mugi »

Danke sehr :)
das wird aber leider nicht funktionieren falls die ersten Buchstaben unterschiedlich sind (etwa im Falle von "Emanual" und "Imanual")
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: QString vergleich

Beitrag von Marcus Breuer »

Hi,

ich weiß. Die zweite Variante findet zumindest mehr Treffer. Du könntest es natürlich noch so machen, dass Du das erste Zeichen des übergebenen Strings ignorierst. Dann könntest Du deinem Vorhaben vielleicht etwas näher kommen.

Beste Grüße,
Marcus
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QString vergleich

Beitrag von franzf »

Du solltest dir anschauen wie Rechtschreibkorrekturen das machen. Sourcescode von aspell/myspell liegen offen, evtl. kannst du die aber auch direkt verwenden.
Wobei ich sagen muss, dass so eine Korrektur nicht gerade Benutzerfreundlich ist (auch wenn der Gedanke sicher gut gemeint ist). Der Sinn eines Adressbuches ist ja eben der, unterschiedliche Menschen mit unterschiedlichen Namen darin abzulegen (also: die Kontakte, nicht die Menschen ;)). Wenn ich "Bernd" tippe, die Software aber meint der Kerl heißt "Bernhard" oder "Gerd", oder "Brandon" und das mit einem fetten Popup kund tut, ich weiß nicht was ich tun würde ^^
Antworten