最近遇到了两个个很有意思的问题,这里总结一下:
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::ConnectionType type = 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会导致在调试后程序报错,无法正常运行。
声明
下