1

当用户在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;
    }
4

3 回答 3

1

我相信您会遇到崩溃,因为您正在使用 sendEvent 发送您无法控制的事件对象。

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

如果您真的想使用该sendEvent()功能,那么我建议您在堆栈上创建自己的 QKeyEvent 并将其传递给sendEvent()函数(如此处所示,或者您可以执行以下操作:

lineEdit.setText( lineEdit.text() + event->text() );
于 2011-10-09T23:06:05.623 回答
0

最简单的方法是使用QKeyEvent::text而不是,QKeyEvent::key你应该没问题。您也可以尝试创建一个副本QKeyEvent并将其传递给您的QLineEdit. 尽管这些都是技巧而不是解决方案。如果您在QLineEdit获得焦点时需要在主窗口中使用快捷方式(假设它在此窗口中),您可以使用QShortcut上下文Qt::WidgetWithChildrenShortcut- 这样您就可以LineEdit始终保持活动状态。

于 2011-10-09T19:35:57.270 回答
0

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

于 2014-01-29T08:24:03.620 回答