【问题标题】:No Keyboard input if QLineEdit on frameless popup window如果 QLineEdit 在无框弹出窗口上没有键盘输入
【发布时间】:2015-05-28 19:16:06
【问题描述】:

当父小部件定义为:

setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);

任何放置在其顶部的编辑框小部件都不会接收键盘输入。鼠标可以工作,右键单击,上下文菜单,粘贴可以工作——但不能直接键盘输入。任何想法为什么以及如何解决它?

【问题讨论】:

  • 我无法在 Windows 7 上使用 Qt Creator 2.3.1 和 Qt 4.7.4 重现您的问题。我所拥有的只是一个 QMainWindow,其中一个小部件是 QLineEdit - 我在 QMainWindow 上调用了你的 setWindowFlags(line)。效果很好 - 我可以输入文字,没问题。
  • 我的应用程序上的容器窗口不是主窗口。也许这会有所不同。另一个论坛上的一个人建议他有一个类似的问题,当他激活容器窗口时这个问题得到了解决。会试一试并在这里发布我的结果。
  • 我也有同样的问题。我有一个从 QDialog 派生的简单类,在构造函数中我将 Qt::WindowFlags 设置为 Qt::Popup。看来这是一个Qt错误。 Windows 7,Qt 4.8 => 工作正常。 Windows 7、Qt 5.4 => 不起作用。 Windows 8、Qt 5.4 => 不起作用。但是,如果我设置断点并暂停执行一段时间(在 showEvent( QShowEvent* ) 中)然后继续执行,我可以以所需的方式使用该 QLineEdit。

标签: qt


【解决方案1】:

正如我之前在评论中提到的,我遇到了同样的问题,但现在使用以下代码修复了它:

// virtual override
void MyDialog::showEvent( QShowEvent* aShowEvent )
{
    QDialog::showEvent( aShowEvent );
    activateWindow();
}

添加 activateWindow() 函数调用后,我可以在弹出对话框中使用 QLineEdit。

我在 Windows 8.1 上使用 Visual Studio 2013 和 Qt 5.4.1。

【讨论】:

  • 谢谢!!!它也适用于菜单操作中的小部件。没有这个就无法激活输入法。
【解决方案2】:
#include "StdAfx.h"
#include "qfindedit.h"

QFindEdit::QFindEdit(QWidget *parent)
: QLineEdit(parent)
, m_bEditFocus(true)
{
    setPlaceholderText("please input find word");

m_stringListmodel = new QStringListModel(this);
m_pFindWnd = new QListView(this);
//m_pFindWnd->setWindowFlags(Qt::Popup);
m_pFindWnd->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_pFindWnd->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_pFindWnd->setSelectionBehavior(QAbstractItemView::SelectRows);
m_pFindWnd->setSelectionMode(QAbstractItemView::SingleSelection);
m_pFindWnd->setParent(0, Qt::Popup);
m_pFindWnd->setFocusPolicy(Qt::NoFocus);
m_pFindWnd->setFocusProxy(this);

connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(textEditedSlot(const QString&)));
QObject::connect(m_pFindWnd, SIGNAL(clicked(QModelIndex)),
    this, SLOT(clickedSlot(QModelIndex)));
QObject::connect(this, SIGNAL(activated(QModelIndex)),
    m_pFindWnd, SLOT(hide()));

this->installEventFilter(this);
m_pFindWnd->installEventFilter(this);

}

QFindEdit::~QFindEdit()
{
    delete m_pFindWnd;
}

QStringList& QFindEdit::stringList()
{
    return m_stringList;
}

void QFindEdit::showFindWnd(const QString& text)
{
QStringList sl;  
foreach(QString word, m_stringList) {  
    if (word.contains(text)) {  
        sl << word; 
    }  
}

if (sl.size() == 0) 
{
    hideFineWnd();
    return;
}
m_stringListmodel->setStringList(sl);  
m_pFindWnd->setModel(m_stringListmodel);  

m_pFindWnd->resize(rect().width(), 200);
QPoint pTopleft = mapToGlobal(rect().bottomLeft());
m_pFindWnd->move(pTopleft.x(), pTopleft.y());
m_pFindWnd->show();
}

void QFindEdit::textEditedSlot(const QString& text)
{
    QString strText = text.trimmed();
    if (!strText.isEmpty())
    {
        showFindWnd(strText);
    }
    else
    {
        hideFineWnd();
    }
}

void QFindEdit::clickedSlot(QModelIndex modelIndex)
{
    setText(m_pFindWnd->model()->data(modelIndex).toString());
    hideFineWnd();
}

void QFindEdit::hideFineWnd()
{
    m_pFindWnd->hide();
}

bool QFindEdit::eventFilter(QObject *o, QEvent *e)
{
if (m_bEditFocus && (o == this) && e->type() == QEvent::FocusOut) 
{
    if (m_pFindWnd && m_pFindWnd->isVisible())
        return true;
}

if (o != m_pFindWnd)
    return __super::eventFilter(o, e);

switch (e->type()) 
{
case QEvent::KeyPress: 
    {
        QKeyEvent *ke = static_cast<QKeyEvent *>(e);
        QModelIndex curIndex = m_pFindWnd->currentIndex();
        QModelIndexList selList = m_pFindWnd->selectionModel()->selectedIndexes();
        const int key = ke->key();

        if ((key == Qt::Key_Up || key == Qt::Key_Down) && selList.isEmpty() && curIndex.isValid() )
        {
            m_pFindWnd->setCurrentIndex(curIndex);
            return true;
        }

        switch (key) 
        {
        case Qt::Key_End:
        case Qt::Key_Home:
            if (ke->modifiers() & Qt::ControlModifier)
                return false;
            break;

        case Qt::Key_Up:
            if (!curIndex.isValid()) 
            {
                int rowCount = m_pFindWnd->model()->rowCount();
                QModelIndex lastIndex = m_pFindWnd->model()->index(rowCount - 1, m_pFindWnd->modelColumn());
                m_pFindWnd->setCurrentIndex(lastIndex);
                return true;
            } 
            else if (curIndex.row() == 0) 
            {
                return true;
            }
            return false;

        case Qt::Key_Down:
            if (!curIndex.isValid()) 
            {
                QModelIndex firstIndex = m_pFindWnd->model()->index(0, m_pFindWnd->modelColumn());
                m_pFindWnd->setCurrentIndex(firstIndex);
                return true;
            } 
            else if (curIndex.row() == m_pFindWnd->model()->rowCount() - 1) 
            {
                return true;
            }
            return false;
        }

        m_bEditFocus = false;
        this->event(ke);
        m_bEditFocus = true;
        if ( e->isAccepted() || !m_pFindWnd->isVisible()) {
            if (!this->hasFocus())
                hideFineWnd();
            if (e->isAccepted())
                return true;
        }

        switch (key) 
        {
        case Qt::Key_Return:
        case Qt::Key_Enter:
        case Qt::Key_Tab:
            hideFineWnd(); 
            if (curIndex.isValid()) 
            {  
                QString text = m_pFindWnd->currentIndex().data().toString();  
                setText(text);  
            }  
            break;

        case Qt::Key_F4:
            if (ke->modifiers() & Qt::AltModifier)
                hideFineWnd();
            break;

        case Qt::Key_Backtab:
        case Qt::Key_Escape:
            hideFineWnd();
            break;

        default:
            break;
        }

        return true;
    }
case QEvent::MouseButtonPress: 
    if (!m_pFindWnd->underMouse()) 
    {
        hideFineWnd();
        return true;
    }
    return false;
case QEvent::InputMethod:
case QEvent::ShortcutOverride:
    QApplication::sendEvent(this, e);
    break;

default:
    return false;
}
return false;
}

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 2014-05-29
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      相关资源
      最近更新 更多