Seite 1 von 1
QString vergleich
Verfasst: 13. September 2012 15:06
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
Re: QString vergleich
Verfasst: 15. September 2012 11:35
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
Re: QString vergleich
Verfasst: 15. September 2012 20:49
von mugi
Danke sehr

das wird aber leider nicht funktionieren falls die ersten Buchstaben unterschiedlich sind (etwa im Falle von "Emanual" und "Imanual")
Re: QString vergleich
Verfasst: 16. September 2012 10:33
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
Re: QString vergleich
Verfasst: 16. September 2012 15:00
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 ^^