2011-10-04 139 views
6

如果QLineEdit的无键盘输入当父部件与定义。鼠标将工作,右键单击,上下文菜单,粘贴将工作 - 但不直接键盘输入。任何想法为什么以及如何修复?上无框弹出窗口

+0

我无法在Windows 7上使用Qt Creator 2.3.1和Qt 4.7.4重现您的问题。我所拥有的只是一个QMainWindow,其中一个是QLineEdit,我在QMainWindow上调用了setWindowFlags(line)。它运行良好 - 我能够输入文本,没有问题。 –

+0

我的应用程序上的容器窗口不是主窗口。也许这会有所作为。在另一个论坛上的一个人建议他有一个类似的问题,当他激活容器窗口时就解决了。将尝试并在此发布我的结果。 – JasonGenX

+0

我有同样的问题。我有一个从QDialog派生的简单类,在构造函数中我将Qt :: WindowFlags设置为Qt :: Popup。看来这是一个Qt错误。 Windows 7,Qt 4.8 =>正常工作。 Windows 7,Qt 5.4 =>不起作用。 Windows 8,Qt 5.4 =>不起作用。但是,如果我设置一个断点并暂停执行一段时间(在showEvent(QShowEvent *))中,然后继续执行,我可以以所需的方式使用该QLineEdit。 –

回答

0
#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; 
} 
1

正如我在评论我有同样的问题,前面提到的,但现在它是固定用下面的代码:

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

我增加了activateWindow()函数调用后,我可以QLineEdit的上使用我的弹出对话框。

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

+0

谢谢!它也用于菜单操作中的小部件。没有这个,它不能激活输入法。 – tamlok