首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt事件覆盖QEvent::KeyRelease仅发生一次

Qt事件覆盖QEvent::KeyRelease仅发生一次
EN

Stack Overflow用户
提问于 2019-08-02 22:13:41
回答 2查看 232关注 0票数 0

我有一个针对Ubuntu的Qt 5.4应用程序。我正在尝试让一个物理按键和触摸屏上的控件做同样的事情。我正在使用QAction。触摸是通过一个信号/插槽激活的,我正在尝试通过action->trigger();激活物理按键。

在它里面,我有一个从QDialog派生的父类,它覆盖了event:

代码语言:javascript
复制
class MyParentDialog : public QDialog
{
...
protected:
   virtual bool event (QEvent *event);
...
}

并且从它派生的类有一个问题,它也覆盖了事件:

代码语言:javascript
复制
class MyChildDialog : public MyParentDialog
{
...
protected:
   virtual bool event (QEvent *qEvent);
...
}

实施:

代码语言:javascript
复制
bool MyChildDialog::event (QEvent *qEvent)
{
qInfo()<<"MyChildDialog::event"<< qEvent->type();

switch (qEvent->type ())
{
    case QEvent::KeyRelease:
    {
        QKeyEvent *keyEvt = nullptr;
        keyEvt = dynamic_cast<QKeyEvent *>(qEvent);
        int key = keyEvt->key();
        switch(key)
        {
        case KEY_CH1ON:
        {
            qInfo()<<"MyChildDialog::event KEY_CH1ON";
            bool currCheck = m_pActionRun->isChecked();
            m_pActionRun->trigger();
            bool afterCheck = m_pActionRun->isChecked();
            qInfo()<<"MyChildDialog::event KEY_CH1ON" 
               <<currCheck<<afterCheck;
            return true;
       }

        default:
            return MyParentDialog::event(qEvent);
        }
    }
    return true;

    default:
        return MyParentDialog::event(qEvent);
}

return true;
}

如果我注释掉行"m_pActionRun->trigger();",我会得到所有期望的事件(qInfo()观察值)。如果我包含该行,我将获得直到第一个KEY_CH1ON之后的所有事件。在那之后,我只得到画图事件。当通过触摸屏信号/插槽机制激活时,相同的动作代码按预期重复工作。

我是Qt的新手。我是不是错过了触发器重置之类的东西?

提前感谢您的指导。

EN

回答 2

Stack Overflow用户

发布于 2019-08-03 20:17:45

在这些情况下,我通常会发出一个信号,并将其连接到一个插槽以触发操作。对信号/槽进行排队,这样它就不会同步运行,并且可以从另一个事件触发器安全地调用。

向你的类头添加一个信号:

代码语言:javascript
复制
class MyParentDialog : public QDialog
{
...
signals:
    void triggerMyAction();
...
}

在构造函数中(一旦创建了m_pActionRun )添加:

代码语言:javascript
复制
connect(this, &MyParentDialog::triggerMyAction, m_pActionRun, &QAction::trigger, Qt::QueuedConnection);

最后,在MyChildDialog::event中,不直接调用触发器,而是发出以下信号:

代码语言:javascript
复制
emit triggerMyAction();
票数 0
EN

Stack Overflow用户

发布于 2019-08-30 01:18:46

问题出在调用动作或动作本身导致MyChildDialog失去焦点。按下触摸屏,它将再次获得焦点和所有适当的事件。我的解决方法是在主应用程序中添加一个“活动的子对话框”成员。因为我正在使用key releases,所以我在主应用程序中的key 代码中添加了一个hack,以便将焦点重置为MyChildDialog (当标志被设置时)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57328226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档