2011-10-04 135 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