如果QLineEdit的無鍵盤輸入當父部件與定義。鼠標將工作,右鍵單擊,上下文菜單,粘貼將工作 - 但不直接鍵盤輸入。任何想法爲什麼以及如何修復?上無框彈出窗口
Q
上無框彈出窗口
6
A
回答
0
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
相關問題
- 1. 複選框上的Bootstrap彈出窗口
- 2. 彈出窗口對話框
- 3. 無法關閉彈出窗口上makemytrip.com
- 4. jQuery - 無法彈出對話框彈出窗口,它們出現在頁面上
- 5. 彈出窗口:當彈出彈出窗口時關閉彈出
- 6. 關閉彈出窗口按鈕上的彈出窗口
- 7. 如何顯示其他彈出窗口上的彈出窗口?
- 8. 彈出窗口上的EditText
- 9. 彈出窗口上軌
- 10. 彈出窗口
- 11. Android彈出窗口在彈出窗口外彈出時解僱
- 12. 無法發送彈出窗口出現
- 13. WPF彈出窗口:如何在彈出窗口周圍添加邊框?
- 14. 將鼠標懸停在打開的彈出窗口上,將鼠標移出關閉彈出窗口,彈出窗口應該不會關閉彈出窗口
- 15. 彈出式彈性窗口
- 16. 退出彈出式窗口與彈出式窗口
- 17. 窗口彈出和機器人框架
- 18. Android彈出窗口與Android對話框
- 19. 大寫對話框彈出窗口
- 20. Android圖像對話框/彈出窗口
- 21. 彈出式窗口或模式框?
- 22. EditText.getText彈出窗口對話框
- 23. Vaadin。組合框響應彈出窗口
- 24. Android通知 - 彈出窗口對話框
- 25. jQuery Mobile彈出窗口和對話框
- 26. Android:彈出對話框樣式窗口
- 27. ie8彈出窗口
- 28. Javascript彈出窗口
- 29. 彈出窗口programmaticall
- 30. mvc彈出窗口
我無法在Windows 7上使用Qt Creator 2.3.1和Qt 4.7.4重現您的問題。我所擁有的只是一個QMainWindow,其中一個是QLineEdit,我在QMainWindow上調用了setWindowFlags(line)。它運行良好 - 我能夠輸入文本,沒有問題。 –
我的應用程序上的容器窗口不是主窗口。也許這會有所作爲。在另一個論壇上的一個人建議他有一個類似的問題,當他激活容器窗口時就解決了。將嘗試並在此發佈我的結果。 – JasonGenX
我有同樣的問題。我有一個從QDialog派生的簡單類,在構造函數中我將Qt :: WindowFlags設置爲Qt :: Popup。看來這是一個Qt錯誤。 Windows 7,Qt 4.8 =>正常工作。 Windows 7,Qt 5.4 =>不起作用。 Windows 8,Qt 5.4 =>不起作用。但是,如果我設置一個斷點並暫停執行一段時間(在showEvent(QShowEvent *))中,然後繼續執行,我可以以所需的方式使用該QLineEdit。 –