Pregunta

En Qt, hay una clase QCompleter que proporciona funtionanity-auto completo. Quiero usar QListView para terminar la misma cosa. En el siguiente código, Cuando el QListView muestra, QLineEdit perderá el foco. ¿Cómo podría mantener el foco de 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();
}
¿Fue útil?

Solución

Uso Qt::ToolTip en lugar de Qt::Popup, de esta manera:

mView->setParent(0, Qt::ToolTip);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top