当用户在基于QWidget
的窗口中键入时,我想要一个QLineEdit
来处理所有输入键,所以我在keyPressEvent()
的QWidget
中尝试了以下两个解决方案:
一个。
void Window::keyPressEvent (QKeyEvent *e)
{
switch (e->key())
{
// handle other short cuts
default:
QApplication::sendEvent (lineEdit , e);
break;
}
}
好吧,这有时会崩溃整个界面,特别是当我resize window
。
B.
void Window::keyPressEvent (QKeyEvent *e)
{
switch (e->key())
{
// handle other short cuts
default:
if ( ! lineEdit.hasFocus () )
{
lineEdit.setFocus ();
lineEdit.setText (e->key());
// i wanted to push the first key input to that QLineEdit , but how ?
// or i'll miss it
}
break;
}
}
此外,我正在考虑一直给予lineEdit
焦点,但我不能这样做,因为其他事件需要由主UI处理。
当我过滤键输入时它不会崩溃,但为什么呢?
default:
if ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ||
(e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z )
)
QApplication::sendEvent(filter , e);
break;
}
我相信你遇到了崩溃,因为你使用sendEvent发送一个你无法控制的事件对象。
我不认为Qt事件系统希望你抓住它的事件并将它们扔向其他方向,并且很可能事件对象在行编辑期望之前被销毁。在您过滤掉输入键的情况下,它可能不会崩溃,因为行编辑不关心那些类型的键击,并且没有像其他情况那样使用事件对象。
如果你真的想使用sendEvent()
功能,那么我建议你在堆栈上创建自己的QKeyEvent并将其传递给sendEvent()
函数(如here所示),或者你可以这样做:
lineEdit.setText( lineEdit.text() + event->text() );
当窗口小部件不处理事件时,它会将其转发给其父窗口。因此,使用sendEvent()转发给子进程是危险的,因为它可以进行递归。
最简单的方法是使用QKeyEvent::text
而不是QKeyEvent::key
,你应该没问题。您也可以尝试创建QKeyEvent
的副本并将其传递给您的QLineEdit
。虽然这些解决方案比解决方案更糟糕。如果你需要主窗口中的快捷方式而QLineEdit
有焦点(假设它在这个窗口中)你可以使用QShortcut
和Qt::WidgetWithChildrenShortcut
上下文 - 这样你就可以随时保持你的LineEdit
活跃。