Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何制作一个Qt对话框来处理关键事件,而不是它的所有子部件?_Qt_Keypress_Qt4.7_Qkeyevent - Fatal编程技术网

如何制作一个Qt对话框来处理关键事件,而不是它的所有子部件?

如何制作一个Qt对话框来处理关键事件,而不是它的所有子部件?,qt,keypress,qt4.7,qkeyevent,Qt,Keypress,Qt4.7,Qkeyevent,我有一个对话框。该对话框有许多小部件,包括Qbuttons、QLabel、QGraphicsView等。许多小部件(如button)在获得焦点时可以处理空格键按下事件。现在我不想让任何子窗口小部件来处理它,而是让主对话框来处理。因为主对话框中有很多小部件,所以我没有为它们安装AllEventFilter,而是为qApp安装 代码如下: QApplication app(argc, 0); MyDialog *pDlg = new MyDialog(...); qApp->installEv

我有一个对话框。该对话框有许多小部件,包括Qbuttons、QLabel、QGraphicsView等。许多小部件(如button)在获得焦点时可以处理空格键按下事件。现在我不想让任何子窗口小部件来处理它,而是让主对话框来处理。因为主对话框中有很多小部件,所以我没有为它们安装AllEventFilter,而是为qApp安装

代码如下:

QApplication app(argc, 0);
MyDialog *pDlg = new MyDialog(...);
qApp->installEventFilter(pDlg);
app.exec();
和主对话框的eventfilter:

bool MyDialog::eventFilter(QObject *obj, QEvent *e)
{
    if(e->type() == QEvent::KeyPress)
    {
        QKeyEvent *ke = static_cast<QKeyEvent*>(e);
        if (ke->key == Qt::Key_Space && !ke->isAutoRepeat())
        {
            // do my things in the main dialog
            return true;
        }
    }
    return qApp->eventFilter(watched, event);
}
bool MyDialog::eventFilter(QObject*obj,QEvent*e)
{
如果(e->type()==QEvent::KeyPress)
{
QKeyEvent*ke=静态_转换(e);
如果(ke->key==Qt::key\u Space&&!ke->isAutoRepeat())
{
//在主对话框中执行我的操作
返回true;
}
}
返回qApp->eventFilter(监视的,事件);
}

不幸的是,使用此代码后,主对话框的布局很奇怪,似乎有些小部件不记得它们的大小策略。可能未处理某些Qt调整大小或重新绘制事件?有谁能告诉我如何在主对话框中捕捉按键事件,但不影响其他功能吗?

基本上,如果您在Qt中开发基于对话框的应用程序,默认情况下,按键事件由主对话框类捕获,前提是您在主类中定义了按键事件

编辑 为此,请使用
postevent()

在您的子窗口小部件中,按键事件do

void childwdgt::keyPressEvent(QKeyEvent *e)
{
if (e->type() == QEvent::KeyPress)
{
    {
        QKeyEvent* newEvent = new QKeyEvent(QEvent::KeyPress,e->key(), e->modifiers ());
        qApp->postEvent (yourParentWdgt, newEvent, 0);
    }
}

类似地,您也可以处理其他类型的按键事件。

如果一个小部件(如按钮)获得焦点,然后按下一个键,则会调用焦点小部件的按键事件,而不会处理其父项。我想也许qApp会将事件发送到正确的目的地(聚焦小部件)。谢谢您的回复。覆盖子部件的事件处理方法或安装事件过滤器即可。但是在主要的diloag中,有许多小部件,因此会编写大量代码,并且结构不好。我想我应该处理关键事件,所有事件都准备好发送。