2009-12-18 16 views
7

QCompleter'ı QLineEdit ile kullanıyorum ve QCompleter'in modelini dinamik olarak güncellemek istiyorum. Örneğin, modelin içeriği QLineEdit'in metnine göre güncellenir.QCompleter'in modeli dinamik olarak nasıl güncellenir

1) mdict.h

#include <QtGui/QWidget> 

class QLineEdit; 
class QCompleter; 
class QModelIndex; 

class mdict : public QWidget 
{ 
    Q_OBJECT 

public: 
    mdict(QWidget *parent = 0); 
    ~mdict() {} 

private slots: 
    void on_textChanged(const QString &text); 

private: 
    QLineEdit *mLineEdit; 
    QCompleter *mCompleter; 
}; 

2) mdict.cpp

#include <cassert> 
#include <QtGui> 
#include "mdict.h" 

mdict::mdict(QWidget *parent) : QWidget(parent), mLineEdit(0), mCompleter(0) 
{ 
    mLineEdit = new QLineEdit(this); 
    QPushButton *button = new QPushButton(this); 
    button->setText("Lookup"); 

    QHBoxLayout *layout = new QHBoxLayout(this); 
    layout->addWidget(mLineEdit); 
    layout->addWidget(button); 
    setLayout(layout); 

    QStringList stringList; 
    stringList << "m0" << "m1" << "m2"; 
    QStringListModel *model = new QStringListModel(stringList); 
    mCompleter = new QCompleter(model, this); 
    mLineEdit->setCompleter(mCompleter); 

    mLineEdit->installEventFilter(this); 

    connect(mLineEdit, SIGNAL(textChanged(const QString&)), 
      this, SLOT(on_textChanged(const QString&))); 
} 

void mdict::on_textChanged(const QString &) 
{ 
    QStringListModel *model = (QStringListModel*)(mCompleter->model()); 
    QStringList stringList; 
    stringList << "h0" << "h1" << "h2"; 
    model->setStringList(stringList); 
} 

beklediğim ben girişi "h", bana "h0" ile otomatik tamamlama listesini vermelidir zaman , "h1" ve "h2" ile öğeyi seçmek için keyborad kullanabiliriz. Ama beklediğim gibi davranmıyor.

Modelin, QLineEdit "textChanged" sinyalini yayınlamadan önce ayarlanması gerektiği anlaşılıyor. Bir yol, "keyPressEvent" i yeniden düzenlemektir, ancak QLineEdit'in metnini almak için birçok koşulu içerir.

QCompleter'in modelini dinamik olarak güncellemenin kolay bir yolu olduğunu bilmek isterim.

+0

Ben olayı denedim, çalışıyor, ancak basılmasını (örneğin Backspace ....) Pek çok türü vardır için kullanımı kolay değildir. Qlinecontrol.cpp'de daha fazla ayrıntı görebilirsiniz. Sadece bilmek istiyorum kolay bir şekilde yapılabilir mi? –

cevap

4

Oh, cevap bulduk:

Kullanım sinyali yerine "TextChanged" nin "textEdited".

QT'nin kaynak kodundaki hata ayıklama bana cevabı verdi.

Foo:Foo() 
{ 
    ... 
    QLineEdit* le_foodName = new QLineEdit(this); 
    QCompleter* foodNameAutoComplete = new QCompleter(this); 
    le_foodName->setCompleter(foodNameAutoComplete); 

    updateFoodNameAutoCompleteModel(); 
    ... 
} 

// We call this function everytime you need to update completer 
void Foo::updateFoodNameAutoCompleteModel() 
{ 
    QStringListModel *model; 
    model = (QStringListModel*)(foodNameAutoComplete->model()); 
    if(model==NULL) 
     model = new QStringListModel(); 

    // Get Latest Data for your list here 
    QStringList foodList = dataBaseManager->GetLatestFoodNameList() ; 

    model->setStringList(foodList); 
    foodNameAutoComplete->setModel(model); 
} 
+0

Bu benim için biraz yardımcı oldu ama ben hala bir dizinde daha derine kazmaya çalışırken segmentasyon hatası alıyorum, lütfen [paste bin] üzerindeki koda bakın (http://pastebin.com/Jxziq8hW) .. –

1

Böyle bir şey kullanabilirsiniz. Bu özellik filtrenin nasıl yapıldığını tutar. FilterMode, Qt::MatchStartsWith olarak ayarlanmışsa, yalnızca yazılan karakterlerle başlayan girişler görüntülenir. Qt::MatchContains, yazılan karakterleri içeren girişleri ve yazılan karakterlerle sonlananları Qt::MatchEndsWith görüntüler. Şu anda yalnızca bu üç mod uygulanmaktadır. FilterMode'u başka bir Qt::MatchFlag'a ayarlamak bir uyarı verir ve hiçbir eylem gerçekleştirilmez. Varsayılan mod Qt::MatchStartsWith'dur.

Bu tesis Qt 5.2.

Erişim fonksiyonları:

Qt::MatchFlags filterMode() const 
void setFilterMode(Qt::MatchFlags filterMode) 
0

Kullanım filterMode : Qt::MatchFlags özelliği:

İlgili konular