2009-12-17 26 views
0

Dans Qt, il existe une classe QCompleter qui fournit une fonctionnalité automatique. Je veux utiliser QListView pour finir la même chose. Dans le code suivant, lorsque le QListView montre, QLineEdit perdra le focus. Comment pourrais-je garder le focus de QLineEdit?Définition du focus sur QLineEdit lors de l'affichage de la vue QListView

1) mdict.h:

#include <QtGui/QWidget> 

class QLineEdit; 
class QListView; 
class QModelIndex; 

class mdict : public QWidget 
{ 
    Q_OBJECT 

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

private slots: 
    void on_textChanged(const QString &); 
    void completeText(const QModelIndex &); 

private: 
    QLineEdit *mLineEdit; 
    QListView *mView; 
}; 

2) mdict.cpp

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

mdict::mdict(QWidget *parent) : QWidget(parent), mLineEdit(0), mView(0) 
{ 
    mLineEdit = new QLineEdit(this); 

    QVBoxLayout *layout = new QVBoxLayout(this); 
    layout->addWidget(mLineEdit); 
    layout->addStretch(100); 
    setLayout(layout); 

    QStringList stringList; 
    stringList << "m0" << "m1" << "m2"; 
    QStringListModel *model = new QStringListModel(stringList); 
    mView = new QListView(this); 
    mView->setModel(model); 
    mView->setEditTriggers(QAbstractItemView::NoEditTriggers); 
    mView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    mView->setSelectionBehavior(QAbstractItemView::SelectRows); 
    mView->setSelectionMode(QAbstractItemView::SingleSelection); 
    mView->setParent(0, Qt::Popup); 
    mView->setFocusPolicy(Qt::NoFocus); 
    mView->setFocusProxy(mLineEdit); 

    connect(mLineEdit, SIGNAL(textChanged(const QString&)), 
     this, SLOT(on_textChanged(const QString &))); 
    connect(mView, SIGNAL(activated(const QModelIndex &)), 
     this, SLOT(completeText(const QModelIndex &))); 
    connect(mView, SIGNAL(clicked(const QModelIndex &)), 
     this, SLOT(completeText(const QModelIndex &))); 
} 

void mdict::on_textChanged(const QString &text) 
{ 
    int lineEidtWidth = mLineEdit->width(); 
    mView->setMinimumWidth(lineEidtWidth); 
    mView->setMaximumWidth(lineEidtWidth); 
    mView->setMaximumHeight(60); 

    QPoint p(0, mLineEdit->height()); 
    int x = mLineEdit->mapToGlobal(p).x(); 
    int y = mLineEdit->mapToGlobal(p).y(); 
    mView->move(x, y); 
    mView->show(); 
} 

void mdict::completeText(const QModelIndex &index) 
{ 
    mLineEdit->setText(index.data().toString()); 
    mView->hide(); 
} 

3) main.cpp

#include "mdict.h" 

#include <QtGui> 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    mdict w; 
    w.show(); 
    return a.exec(); 
} 

Répondre

0

utilisation Qt::ToolTip i lutôt de Qt::Popup, de cette façon:

mView->setParent(0, Qt::ToolTip); 
+0

Merci, vous avez raison. J'ai lu la mise en œuvre de QCompleter, il utilise "Qt :: Popup", je pense que j'ai besoin de plus d'analyse pour trouver pourquoi les comportements QCompleter correctement. –