2009-12-18 38 views
7

Tôi sử dụng QCompleter với QLineEdit và tôi muốn cập nhật mô hình của QCompleter theo cách động. tức là nội dung của mô hình được cập nhật theo văn bản của QLineEdit.Cách cập nhật mô hình của QCompleter tự động

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

tôi mong muốn khi tôi đầu vào "h", nó sẽ cho tôi một danh sách tự động hoàn tất với "h0" , "h1" và "h2" và tôi có thể sử dụng keyborad để chọn mục. Nhưng nó không có hành vi như tôi mong đợi.

Dường như mô hình nên được đặt trước khi QLineEdit phát ra tín hiệu "textChanged". Một cách là để thực hiện lại "keyPressEvent", nhưng nó liên quan đến nhiều điều kiện để có được văn bản của QLineEdit.

Vì vậy, tôi muốn biết có cách nào dễ dàng để cập nhật mô hình của QCompleter tự động không?

+0

Tôi đã thử sự kiện, nó hoạt động, nhưng nó không phải là dễ dàng để sử dụng cho có rất nhiều loại bấm phím (ví dụ Backspace ....). Trong qlinecontrol.cpp, bạn có thể xem thêm chi tiết. Tôi chỉ muốn biết nó có thể được thực hiện một cách dễ dàng? –

Trả lời

4

Ồ, tôi đã tìm thấy câu trả lời:

Sử dụng tín hiệu "textEdited" thay vì "textChanged".

Mã nguồn của QT gỡ lỗi cho tôi biết câu trả lời.

+0

Đây cũng là một số trợ giúp cho tôi nhưng tôi vẫn nhận được lỗi phân đoạn khi tôi cố gắng đào sâu hơn trong một thư mục, vui lòng xem mã trên [dán bin] (http://pastebin.com/Jxziq8hW) .. –

1

Bạn có thể sử dụng một cái gì đó như thế này:

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

Sử dụng filterMode : Qt::MatchFlags tài sản. Thuộc tính này giữ cách lọc được thực hiện. Nếu filterMode được đặt thành Qt::MatchStartsWith, chỉ những mục nhập bắt đầu bằng các ký tự đã nhập mới được hiển thị. Qt::MatchContains sẽ hiển thị các mục nhập có chứa các ký tự đã nhập và Qt::MatchEndsWith các ký tự kết thúc bằng các ký tự đã nhập. Hiện tại, chỉ ba chế độ này được triển khai. Đặt bộ lọcMode thành bất kỳ Qt::MatchFlag nào khác sẽ đưa ra cảnh báo và sẽ không có hành động nào được thực hiện. Chế độ mặc định là Qt::MatchStartsWith.

Thuộc tính này đã được giới thiệu trong Qt 5.2.

chức năng truy cập:

Qt::MatchFlags filterMode() const 
void setFilterMode(Qt::MatchFlags filterMode) 
Các vấn đề liên quan