2009-12-17 6 views
0

Qt에는 자동 완료 기능을 제공하는 QCompleter 클래스가 있습니다. 동일한 것을 끝내기 위해 QListView을 사용하고 싶습니다. 다음 코드에서 QListView이 표시되면 QLineEdit은 포커스를 잃게됩니다. QLineEdit의 초점을 어떻게 유지할 수 있습니까?QListView 뷰를 표시하는 동안 QLineEdit에 포커스 설정

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

답변

0

사용 Qt::ToolTip I

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

고마워, 네가 맞다. QCompleter의 구현을 읽었으며 "Qt :: Popup"을 사용합니다. 왜 QCompleter 동작이 올바르게 작동하는지 더 자세히 분석해야한다고 생각합니다. –