请教QT前辈的问题(QT事件传递),是高手你就进来

首先介绍一下本人QT项目的总体布局框架:

          Qt界面是用在医学放射机上的一个操作界面(1024X768),因为操作界面需要选择,所以在最顶层定义了QStackedwidget里面分别放了三个view(分别选择0、90、180度),每个view里面的内容都是一样的,只是布局不一样,在工程的构造函数中定义一个QFrame,new出这个QFrame的时候是没指定它的父类的;尺寸定义为1024X768,里面放有QComboBox和Lineedit的对象;在工程中定义一个按钮,connect这个按钮的clicked信号到一个槽函数,在槽函数中显示这个QFrame。

         如果在显示之前不指定这个QFrame的父类(QStackedwidget中的一个view中的scene中的widget,尺寸也是1024X768),QFrame中的QComboBox的操作是正常的(点击QComboBox,弹出它的下拉框,在点击这个下拉框中的item,QComboBox收回这个下拉框,同时在QComboBox上显示刚才选中的那个item)、lineedit也是正常的(点击QLineedit、它就会全选里面的内容,等待工程里面弹出一个数字输入框弹出,一旦有输入数字,就会删除QLineedit中原有的数据)。

         如果在显示之前指定这个QFrame的父类(QStackedwidget中的一个view中的scene中的widget,尺寸也是1024X768),这样可以让它弹出之后跟着旋转,此时问题就出来了:第一次点击QComboBox操作和上面没指定QFrame的父类是一样的(正常),从第二次点击它开始,弹出下拉框之后,没有人为的点击这个下拉框里面的item,它就自动收回下拉框,如果是双击这个QComboBox,则下拉框不自动收回,其中的QLineedit在弹出数字输入框以后,本来在edit里面的内容要全部选中的,现在也只有一部分被选中。经过分析,应该是父窗口中的事件对这个QFrame中的对象产生了影响。

以下是我在工程中利用事件过滤器eventFilter对这个QComboBox对象被点击的时候捕捉到的一些事件如下图所示:

测试代码如下:

small_disp_combobox->installEventFilter(this);(构造函数中的)

bool Service_Setting::eventFilter(QObject*object,QEvent *event)

{
    if(object == small_disp_combobox)
    {
        qDebug()<<"small_disp_combobox event is = "<<event->type();       
    }
}

 

事件测试结果:

未指定horizontal_service_stack的父类hor_view_widget时,测试small_disp_combobox产生的事件括号里的内容是注释这个整数代表的事件

1):进入显示small_disp_combobox之前产生了以下事件:

small_disp_combobox event is =  13QEvent::Move

small_disp_combobox event is =  14QEvent::Resize

small_disp_combobox event is =  17QEvent::Show

small_disp_combobox event is =  26QEvent::ShowToParent

small_disp_combobox event is =  12QEvent::Paint

small_disp_combobox event is =  12QEvent::Paint

2):单击一下small_disp_combobox产生了以下事件(没有自动收回):

small_disp_combobox event is =10QEvent::Enter

small_disp_combobox event is =127QEvent::HoverEnter

small_disp_combobox event is =129QEvent::HoverMove

small_disp_combobox event is =8QEvent::FocusIn

small_disp_combobox event is =2QEvent::MouseButtonPress

small_disp_combobox event is =9QEvent::FocusOut

small_disp_combobox event is =9QEvent::FocusOut

small_disp_combobox event is =12QEvent::Paint

3):弹出下拉框以后点击item产生的事件有:

small_disp_combobox event is =8QEvent::HoverMove

small_disp_combobox event is =12QEvent::Paint

4):再次点击small_disp_combobox,产生的事件有:

small_disp_combobox event is =129QEvent::HoverMove

small_disp_combobox event is =2QEvent::MouseButtonPress

small_disp_combobox event is =9QEvent::FocusOut

small_disp_combobox event is =12QEvent::Paint

5):再次点击弹出的item产生的事件有:

small_disp_combobox event is =8QEvent::HoverMove

small_disp_combobox event is =12QEvent::Paint

6):再次点击small_disp_combobox,产生的事件有:

small_disp_combobox event is =129QEvent::HoverMove

small_disp_combobox event is =2QEvent::MouseButtonPress

small_disp_combobox event is =9QEvent::FocusOut

small_disp_combobox event is =12QEvent::Paint

重复步骤5)、6)出现的事件也是重复的(56步骤中列出的事件)

 

指定Qframe的父类为hor_view_widget时,测试small_disp_combobox产生的事件:

1):进入显示之前small_disp_combobox产生了:

small_disp_combobox event is =  17QEvent::Show

small_disp_combobox event is =  26QEvent::ShowToParent

small_disp_combobox event is =  12QEvent::Paint

2):点击一下small_disp_combobox产生了以下事件(没有自动收回):

small_disp_combobox event is =10QEvent::Enter

small_disp_combobox event is =127QEvent::HoverEnter

small_disp_combobox event is =129QEvent::HoverMove

small_disp_combobox event is =129QEvent::HoverMove

small_disp_combobox event is =8QEvent::FocusIn

small_disp_combobox event is =2QEvent::MouseButtonPress

small_disp_combobox event is =9QEvent::FocusOut

small_disp_combobox event is =12QEvent::Paint

small_disp_combobox event is =12QEvent::Paint

129QEvent::HoverMove

3):弹出下拉框以后点击item产生的事件有:

small_disp_combobox event is =12QEvent::Paint

small_disp_combobox event is =8QEvent::FocusIn

small_disp_combobox event is =11QEvent::Leave

small_disp_combobox event is =128QEvent::HoverLeave

small_disp_combobox event is =12QEvent::Paint

small_disp_combobox event is =12QEvent::Paint

4):再次点击small_disp_combobox,产生的事件有(没有自动收回):

1small_disp_combobox event is =0QEvent::Enter

small_disp_combobox event is =127QEvent::HoverEnter

small_disp_combobox event is =129QEvent::HoverMove

small_disp_combobox event is =129QEvent::HoverMove

small_disp_combobox event is =2QEvent::MouseButtonPress

small_disp_combobox event is =9QEvent::FocusOut

small_disp_combobox event is =12QEvent::Paint

small_disp_combobox event is =12QEvent::Paint

small_disp_combobox event is =129QEvent::HoverMove

small_disp_combobox event is =12QEvent::Paint

small_disp_combobox event is =12QEvent::Paint

5):再次点击item,产生的事件有:

small_disp_combobox event is =11QEvent::Leave

small_disp_combobox event is =128QEvent::HoverLeave

small_disp_combobox event is =12QEvent::Paint

small_disp_combobox event is =12QEvent::Paint

6):再次点击small_disp_combobox,产生的事件有(自动收回):

small_disp_combobox event is =  10entry

small_disp_combobox event is =  127

small_disp_combobox event is =  129

small_disp_combobox event is =  129

small_disp_combobox event is =  8

small_disp_combobox event is =  2

small_disp_combobox event is =  9

small_disp_combobox event is =  9

small_disp_combobox event is =  12

small_disp_combobox event is =  12

small_disp_combobox event is =  129

small_disp_combobox event is =  12

small_disp_combobox event is =  12

从实验结果看出,指定这个QFrame的父类与没指定父类在点击QComboBox对象的时候唯一的区别是:在指定这个父类的时候多出现了

small_disp_combobox event is = 11QEvent::Leave),于是我在事件过滤器中把这个Leave和Enter事件过滤掉,代码如下:

bool Service_Setting::eventFilter(QObject*object,QEvent *event)

{
    if(object == small_disp_combobox)
    {
        qDebug()<<"small_disp_combobox event is = "<<event->type();
 
        if((event->type() == QEvent::Leave)||(event->type() == QEvent::Enter))
        {
            event->accept();
            return true;
        }
 
    }
    return QWidget::eventFilter(object, event);
}

但是效果还是一样,这个问题困扰我很久了,求QT的前辈提出意见和建议。

   下拉框示意图。                                                                                                        Lineedit示意图(点击它之后文字只有一部分被选中,正常情况是全部选中)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值