检测Qt for symbian前后台切换 以及 信号槽使用的注意事项

本文介绍了在Qt环境下解决程序切换到后台导致崩溃的问题及避免重复弹窗的方法。通过监听FocusOut事件来捕获程序进入后台的过程,并揭示了信号槽机制中connect函数多次声明导致的重复执行现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到了两个个很有意思的问题,这里总结一下:

1:在Qt for symbian中,当程序运行时:若直接将其切换到后台,则会导致程序崩溃。 为了解决这个问题,我们需要先截获程序切换到后台这个事件本身。试了很多种方法,下边的比较有效:

MainWindow::MainWindow(QWidget *parent,QApplication* a): QWidget(parent)
{
this->setFocusPolicy(Qt::WheelFocus);
a->installEventFilter(this);

iApp = a;

}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
QFocusEvent *focusEvent = static_cast<QFocusEvent*>(event);

if (obj = iApp)
{
if (event->type() == QEvent::FocusOut)
{
RLog::Log(_L("focusOutEvent"));
return true;
}
else
{
return false;
}
}
else
{
return QWidget::eventFilter(obj, event);
}
}

通过打log,可看:当该程序从前台切换到后台时:log中打出了focusOutEvent,达到我们的目的。

亦即:我们是对QApplication对象本身来检测器FocusOut事件。 注意了:同时要对主窗口设置一下setFocusPolicy().

2:和同事一起修一个项目的bug。我们会在点击一个item时候让系统跳出另外一个窗口来。但是不知道为什么,其会跳出两个相同的窗口。

后来追了一下,发现我们调这个窗口出来时通过发一个signal来实现的,在其slot中实现该窗口的显示。但是:我们这里只发了一次该信号。最后才找出问题所在,问题出在connect函数上。

对同一对信号槽,其connect了几次,则发射一个该信号时:其槽便会执行几次! 亦即:槽的执行次数不仅仅取决于signal的发送次数,还取决于connect函数的声明次数! 我们这个bug就在于:connect函数在不同文件中声明了两次,所以才出现slot调用两次的情况。

对于这个问题,需要我们去检查connect函数的声明次数。在Qt4.6或以上版本中,已经有了很好的解决办法,如下

QO Qbject::connect ( const QObject *sender, const char *signal, const QObject *receiver, const char *method,Qt::ConnectionTypetype= Qt::AutoConnection )

只需要将最后一个参数设置为Qt::UniqueConnection即可(该函数声明该信号槽只连接一次,如果已有连接,则次数不生效)。对于Qt4.5,我没有找到好的解决办法同一个程序,在4.5版本下无法使用该参数,在4.6下则可以使用,书写时我们可以使用版本宏来区分。亦即:QT_VERSION宏。

if(QT_VERSION >= 0X040600)

{}

else

{}

3:Qt常用的一些调试方法,qFatal,qWarnning,qCritial,Q_ASSERT等等,这里边 qFatal和Q_ASSERT会导致在调试后程序报错,无法正常运行。

声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值