我有一个针对Ubuntu的Qt 5.4应用程序。我正在尝试让一个物理按键和触摸屏上的控件做同样的事情。我正在使用QAction。触摸是通过一个信号/插槽激活的,我正在尝试通过action->trigger();激活物理按键。
在它里面,我有一个从QDialog派生的父类,它覆盖了event:
class MyParentDialog : public QDialog
{
...
protected:
virtual bool event (QEvent *event);
...
}并且从它派生的类有一个问题,它也覆盖了事件:
class MyChildDialog : public MyParentDialog
{
...
protected:
virtual bool event (QEvent *qEvent);
...
}实施:
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的新手。我是不是错过了触发器重置之类的东西?
提前感谢您的指导。
发布于 2019-08-03 20:17:45
在这些情况下,我通常会发出一个信号,并将其连接到一个插槽以触发操作。对信号/槽进行排队,这样它就不会同步运行,并且可以从另一个事件触发器安全地调用。
向你的类头添加一个信号:
class MyParentDialog : public QDialog
{
...
signals:
void triggerMyAction();
...
}在构造函数中(一旦创建了m_pActionRun )添加:
connect(this, &MyParentDialog::triggerMyAction, m_pActionRun, &QAction::trigger, Qt::QueuedConnection);最后,在MyChildDialog::event中,不直接调用触发器,而是发出以下信号:
emit triggerMyAction();发布于 2019-08-30 01:18:46
问题出在调用动作或动作本身导致MyChildDialog失去焦点。按下触摸屏,它将再次获得焦点和所有适当的事件。我的解决方法是在主应用程序中添加一个“活动的子对话框”成员。因为我正在使用key releases,所以我在主应用程序中的key 代码中添加了一个hack,以便将焦点重置为MyChildDialog (当标志被设置时)。
https://stackoverflow.com/questions/57328226
复制相似问题