• 7736阅读
  • 6回复

[讨论]当事件过滤器所监视的控件指针被重新赋值,出现的问题 [复制链接]

上一主题 下一主题
离线lrbnk
 

只看楼主 倒序阅读 楼主  发表于: 2011-04-14
大家好,我开发过程中出现了这样的问题
父控件安装事件过滤器,被监视的子控件被delete后,重新赋值,但是过滤器却无法再对其接受的事件做出反应
我说的不是很清楚,基本代码如下。
class workPage
{
    private:
          QLabel *   l1;
          QDateEdit * d1;
            ......
};
class cuteface:public QDialog
    {
        Q_OBJECT
                                private:
                                        workPage * wpage;
                                        bool eventFilter(QObject * target, QEvent * event);
                                                 ......
                   };

cuteface::cuteface()
    {
                        ......
                      wpage->installEventFilter(this);
                  ......
}
bool cuteface::eventFilter(QObject * target, QEvent * event)  
{
                if(target == wpage)
               if(event->type() == QEvent::KeyPress)
                     {
                     QKeyEvent * keyevent = static_cast<QKeyEvent *>(event);
                         if(keyevent->key() == Qt::Key_A)
                         {                      
                                                                                                                       delete wpage ;
                             wpage = new workPage;
                            wpage ->installEventFilter(this);
                            wpage ->setFocus();
                                                                                                               return true;
                         }
                                  ......
}                

按过A键后    wpage  被重新赋值,但是针对他的任何事件都无法被事件过滤器捕捉。 请大家帮我分析下,先谢过。
[ 此帖被lrbnk在2011-04-14 23:24重新编辑 ]
离线lrbnk

只看该作者 1楼 发表于: 2011-04-15
哪位大侠来指点下,不胜感激。
离线dbzhang800

只看该作者 2楼 发表于: 2011-04-15
本来想直接说,你应该贴精简后的完整测试程序的。但是这些话我在论坛中好像说了很多遍了。

下面是一个我根据你的问题写的完整的测试程序。结论是什么我就不说了

  1. //filename:  main.cpp
  2. #include <QtGui>
  3. class Widget:public QWidget
  4. {
  5. public:
  6.     Widget();
  7.     bool eventFilter(QObject *obj, QEvent *evt);
  8. private:
  9.     QLineEdit * m_edit;
  10.     int m_index;
  11. };
  12. Widget::Widget()
  13.     :m_edit(new QLineEdit(this)),m_index(0)
  14. {
  15.     m_edit->installEventFilter(this);
  16.     m_edit->setText(QString::number(m_index));
  17. }
  18. bool Widget::eventFilter(QObject *obj, QEvent *evt)
  19. {
  20.     if (obj==m_edit && evt->type()==QEvent::KeyPress
  21.             && static_cast<QKeyEvent*>(evt)->key()==Qt::Key_A)
  22.     {
  23.         m_edit->deleteLater();
  24.         m_edit = new QLineEdit(this);
  25.         m_edit->installEventFilter(this);
  26.         m_edit->setText(QString::number(++m_index));
  27.         m_edit->show();
  28.         m_edit->setFocus();
  29.         return true;
  30.     }
  31.     return false;
  32. }
  33. int main(int argc, char** argv)
  34. {
  35.     QApplication app(argc, argv);
  36.     Widget w;
  37.     w.show();
  38.     return app.exec();
  39. }
离线lrbnk

只看该作者 3楼 发表于: 2011-04-15
我以后多注意发帖的方式,感谢耐心解惑。
离线lrbnk

只看该作者 4楼 发表于: 2011-04-15
失效原因是我在给其中一个子控件指针重新赋值时,忘记将其重新加入事件过滤器。
离线roywillow

只看该作者 5楼 发表于: 2011-04-15
看起来像是wpage = new workPage;之前wpage好像根本就没delete然后就new了
这样没问题吗?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线lrbnk

只看该作者 6楼 发表于: 2011-04-15
贴的代码格式错位,是先delete的。
快速回复
限100 字节
 
上一个 下一个