2011-01-31 14 views

Respuesta

10

usted debería ser capaz de forzar la ventana emergente de más completa para conseguir muestra una vez que su texto línea de edición se borra mediante el uso de QCompliter::complete ranura:

lineEdit->completer()->complete(); 

Así es como puede hacerlo:

  • definir TextChanged ranura para su lineedit;
  • anula el método customEvent para tu ventana;
  • en la ranura de texto enviado evento de usuario a la ventana siempre que el texto de lineedit tenga longitud cero;
  • en el método customEvent mostrar completo cada vez que se recibe un evento de usuario;

A continuación se muestra un ejemplo:

mainwindow.h:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

protected: 
    void customEvent(QEvent * event); 

private: 
    Ui::MainWindow *ui; 

private slots: 
    void on_lineEdit_textChanged(QString); 
}; 

mainwindow.cpp:

class CompleteEvent : public QEvent 
{ 
public: 
    CompleteEvent(QLineEdit *lineEdit) : QEvent(QEvent::User), m_lineEdit(lineEdit) { } 

    void complete() 
    { 
     m_lineEdit->completer()->complete(); 
    } 

private: 
    QLineEdit *m_lineEdit; 
}; 

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

    QStringList wordList; 
    wordList << "one" << "two" << "three" << "four"; 

    QLineEdit *lineEdit = new QLineEdit(this); 
    lineEdit->setGeometry(20, 20, 200, 30); 
    connect(lineEdit, SIGNAL(textChanged(QString)), SLOT(on_lineEdit_textChanged(QString))); 

    QCompleter *completer = new QCompleter(wordList, this); 
    completer->setCaseSensitivity(Qt::CaseInsensitive); 
    completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); 
    lineEdit->setCompleter(completer); 
} 

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

void MainWindow::customEvent(QEvent * event) 
{ 
    QMainWindow::customEvent(event); 
    if (event->type()==QEvent::User) 
     ((CompleteEvent*)event)->complete(); 
} 

void MainWindow::on_lineEdit_textChanged(QString text) 
{ 
    if (text.length()==0) 
     QApplication::postEvent(this, new CompleteEvent((QLineEdit*)sender())); 
} 

esperanza que esta ayuda, que se refiere a

+0

funciona como un encanto, gracias! Intentaba hacer algo similar con un QTimer :: singleShot, pero por alguna razón no funcionaba. –

0

Aquí está mi solución basado en la respuesta de serge_gubenko Esta clase utiliza QStringListModel, pero se puede reemplazar fácilmente con cualquier otro modelo.

Completer_line_edit.h

#include <QLineEdit> 
#include <QStringListModel> 
#include <QTimer> 

/*! Line edit widget with auto completion based on QStringListModel. 
    Modified behaviour: completion list will appear even when contents of 
    line edit is empty. Full list of options will be showed when line edit 
    has focus and is empty. 
    */ 
class Completer_line_edit : public QLineEdit { 
    Q_OBJECT 
public: 
    explicit Completer_line_edit(QWidget *parent = 0); 

    //! Set list of options used for copmletion. 
    inline void set_list(QStringList list) { model.setStringList(list); } 

private: 
    QStringListModel model; 
    void focusInEvent(QFocusEvent *e); 
    void customEvent(QEvent* e); 
    QTimer timer; 

private slots: 
    void slot_text_edited(); 
    void slot_call_popup(); 

}; 

Completer_line_edit.cpp

#include "Completer_line_edit.h" 
#include <QCompleter> 
#include <QEvent> 
#include <QApplication> 

Completer_line_edit::Completer_line_edit(QWidget *parent) : 
    QLineEdit(parent) 
{ 
    setCompleter(new QCompleter()); 
    completer()->setModel(&model); 
    completer()->setCompletionMode(QCompleter::PopupCompletion); 
    completer()->setCaseSensitivity(Qt::CaseInsensitive); 
    connect(this, SIGNAL(textEdited(QString)), this, SLOT(slot_text_edited())); 
} 

void Completer_line_edit::focusInEvent(QFocusEvent *e) { 
    QLineEdit::focusInEvent(e); 
    // force completion when line edit is focued in 
    completer()->complete(); 
} 

void Completer_line_edit::slot_text_edited() { 
    qDebug() << "text edited"; 
    // force to show all items when text is empty 
    completer()->setCompletionMode(text().isEmpty()? QCompleter::UnfilteredPopupCompletion: QCompleter::PopupCompletion); 
    if (text().isEmpty()) { 
    // completion list will be hidden now; we will show it again after a delay 
    timer.singleShot(100, this, SLOT(slot_call_popup())); 
    } 
} 

void Completer_line_edit::slot_call_popup() { 
    // apparently, complete() works only in event handler 
    QApplication::postEvent(this, new QEvent(QEvent::User)); 
} 

void Completer_line_edit::customEvent(QEvent *e) { 
    QLineEdit::customEvent(e); 
    // force completion after text is deleted 
    completer()->complete(); 
} 
Cuestiones relacionadas