【问题标题】:Setting focus on QLineEdit while showing the QListView view在显示 QListView 视图时将焦点设置在 QLineEdit
【发布时间】:2009-12-17 17:25:10
【问题描述】:

在 Qt 中,有一个 QCompleter 类提供自动完成功能。 我想用QListView 来完成同样的事情。在下面的代码中,当QListView 显示时,QLineEdit 将失去焦点。我怎样才能保持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();
}

【问题讨论】:

    标签: qt focus qlistview qlineedit


    【解决方案1】:

    使用Qt::ToolTip而不是Qt::Popup,这样:

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

    【讨论】:

    • 谢谢,你是对的。我阅读了 QCompleter 的实现,它使用“Qt::Popup”,我想我需要更多的分析来找出 QCompleter 行为正确的原因。
    猜你喜欢
    • 2010-10-06
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多