将keyPressEvent静默转移到一个孩子,并使其焦点?

问题描述 投票:1回答:3

当用户在基于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处理。

Update

当我过滤键输入时它不会崩溃,但为什么呢?

 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;
    }
qt focus setfocus qt4.7 qlineedit
3个回答
1
投票

我相信你遇到了崩溃,因为你使用sendEvent发送一个你无法控制的事件对象。

我不认为Qt事件系统希望你抓住它的事件并将它们扔向其他方向,并且很可能事件对象在行编辑期望之前被销毁。在您过滤掉输入键的情况下,它可能不会崩溃,因为行编辑不关心那些类型的键击,并且没有像其他情况那样使用事件对象。

如果你真的想使用sendEvent()功能,那么我建议你在堆栈上创建自己的QKeyEvent并将其传递给sendEvent()函数(如here所示),或者你可以这样做:

lineEdit.setText( lineEdit.text() + event->text() );

0
投票

当窗口小部件不处理事件时,它会将其转发给其父窗口。因此,使用sendEvent()转发给子进程是危险的,因为它可以进行递归。


0
投票

最简单的方法是使用QKeyEvent::text而不是QKeyEvent::key,你应该没问题。您也可以尝试创建QKeyEvent的副本并将其传递给您的QLineEdit。虽然这些解决方案比解决方案更糟糕。如果你需要主窗口中的快捷方式而QLineEdit有焦点(假设它在这个窗口中)你可以使用QShortcutQt::WidgetWithChildrenShortcut上下文 - 这样你就可以随时保持你的LineEdit活跃。

© www.soinside.com 2019 - 2024. All rights reserved.