如果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。 –