您的位置:首页 > 编程语言 > Qt开发

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

2010-05-25 11:30 531 查看
最近遇到了两个个很有意思的问题,这里总结一下:

 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会导致在调试后程序报错,无法正常运行。

 

 

   

 

声明



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt symbian signal