2009-12-18 12 views
7

अद्यतन करने के लिए कैसे मैं QLineEdit के साथ QCompleter का उपयोग करता हूं, और मैं गतिशील रूप से QCompleter के मॉडल को अद्यतन करना चाहता हूं। यानी मॉडल की सामग्री QLineEdit के पाठ के अनुसार अपडेट की जाती है।QCompleter के मॉडल को गतिशील रूप से

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); 
} 

मैं उम्मीद जब मैं इनपुट "h", यह मेरे "H0" के साथ एक स्वत: पूर्ण सूची देना चाहिए , "एच 1", और "एच 2" और मैं आइटम का चयन करने के लिए कीबार्ड का उपयोग कर सकता था। लेकिन जैसा कि मैंने उम्मीद की थी, यह व्यवहार नहीं करता है।

ऐसा लगता है कि मॉडल को QLineEdit "textChanged" सिग्नल उत्सर्जित करने से पहले सेट किया जाना चाहिए। एक तरीका है "keyPressEvent" को पुन: कार्यान्वित करना, लेकिन इसमें QLineEdit के टेक्स्ट को प्राप्त करने के लिए कई स्थितियां शामिल हैं।

तो, मैं जानना चाहता हूं कि QCompleter के मॉडल को गतिशील रूप से अपडेट करने का कोई आसान तरीका है?

+0

मैं घटना की कोशिश की है, यह काम करता है, लेकिन यह वहाँ keypresses (उदाहरण, बैकस्पेस ...।) के इतने प्रकार के होते हैं के लिए उपयोग करने के लिए आसान नहीं है। Qlinecontrol.cpp में, आप अधिक जानकारी देख सकते हैं। मैं सिर्फ यह जानना चाहता हूं कि यह एक आसान तरीके से किया जा सकता है? –

उत्तर

4

ओह, मैं इस सवाल का जवाब मिल गया है:

उपयोग संकेत "textEdited" के बदले "textChanged"।

क्यूटी के स्रोत कोड को डीबग करने से मुझे जवाब बताया गया।

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

यह मेरे लिए कुछ मदद भी रहा है, लेकिन जब भी मैं निर्देशिका में गहरी खुदाई करने की कोशिश कर रहा हूं, तब भी मुझे सेगमेंटेशन गलती मिलती है, कृपया [पेस्ट बिन] (http://pastebin.com/Jxziq8hW) पर कोड देखें। .. –

1

आप कुछ इस तरह उपयोग कर सकते हैं। यह संपत्ति रखती है कि फ़िल्टरिंग कैसे की जाती है। यदि फ़िल्टरमोड Qt::MatchStartsWith पर सेट है, तो टाइप की गई वर्णों से शुरू होने वाली केवल प्रविष्टियां प्रदर्शित की जाएंगी। Qt::MatchContains टाइप किए गए वर्णों वाले अंत में टाइप किए गए वर्णों और Qt::MatchEndsWith प्रविष्टियों को प्रदर्शित करेगा। वर्तमान में, केवल इन तीन तरीकों को लागू किया गया है। फ़िल्टरमोड को किसी अन्य Qt::MatchFlag पर सेट करना एक चेतावनी जारी करेगा, और कोई कार्रवाई नहीं की जाएगी। डिफ़ॉल्ट मोड Qt::MatchStartsWith है।

यह संपत्ति Qt 5.2 में पेश की गई थी।

पहुँच कार्य:

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

उपयोग filterMode : Qt::MatchFlags संपत्ति:

संबंधित मुद्दे