首先介绍一下本人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 = 13(QEvent::Move)
small_disp_combobox event is = 14(QEvent::Resize)
small_disp_combobox event is = 17(QEvent::Show)
small_disp_combobox event is = 26(QEvent::ShowToParent)
small_disp_combobox event is = 12(QEvent::Paint)
small_disp_combobox event is = 12(QEvent::Paint)
2):单击一下small_disp_combobox产生了以下事件(没有自动收回):
small_disp_combobox event is =10(QEvent::Enter)
small_disp_combobox event is =127(QEvent::HoverEnter)
small_disp_combobox event is =129(QEvent::HoverMove)
small_disp_combobox event is =8(QEvent::FocusIn)
small_disp_combobox event is =2(QEvent::MouseButtonPress)
small_disp_combobox event is =9(QEvent::FocusOut)
small_disp_combobox event is =9(QEvent::FocusOut)
small_disp_combobox event is =12(QEvent::Paint)
3):弹出下拉框以后点击item产生的事件有:
small_disp_combobox event is =8(QEvent::HoverMove)
small_disp_combobox event is =12(QEvent::Paint)
4):再次点击small_disp_combobox,产生的事件有:
small_disp_combobox event is =129(QEvent::HoverMove)
small_disp_combobox event is =2(QEvent::MouseButtonPress)
small_disp_combobox event is =9(QEvent::FocusOut)
small_disp_combobox event is =12(QEvent::Paint)
5):再次点击弹出的item产生的事件有:
small_disp_combobox event is =8(QEvent::HoverMove)
small_disp_combobox event is =12(QEvent::Paint)
6):再次点击small_disp_combobox,产生的事件有:
small_disp_combobox event is =129(QEvent::HoverMove)
small_disp_combobox event is =2(QEvent::MouseButtonPress)
small_disp_combobox event is =9(QEvent::FocusOut)
small_disp_combobox event is =12(QEvent::Paint)
重复步骤5)、6)出现的事件也是重复的(5、6步骤中列出的事件)
指定Qframe的父类为hor_view_widget时,测试small_disp_combobox产生的事件:
1):进入显示之前small_disp_combobox产生了:
small_disp_combobox event is = 17(QEvent::Show)
small_disp_combobox event is = 26(QEvent::ShowToParent)
small_disp_combobox event is = 12(QEvent::Paint)
2):点击一下small_disp_combobox产生了以下事件(没有自动收回):
small_disp_combobox event is =10(QEvent::Enter)
small_disp_combobox event is =127(QEvent::HoverEnter)
small_disp_combobox event is =129(QEvent::HoverMove)
small_disp_combobox event is =129(QEvent::HoverMove)
small_disp_combobox event is =8(QEvent::FocusIn)
small_disp_combobox event is =2(QEvent::MouseButtonPress)
small_disp_combobox event is =9(QEvent::FocusOut)
small_disp_combobox event is =12(QEvent::Paint)
small_disp_combobox event is =12(QEvent::Paint)
129(QEvent::HoverMove)
3):弹出下拉框以后点击item产生的事件有:
small_disp_combobox event is =12(QEvent::Paint)
small_disp_combobox event is =8(QEvent::FocusIn)
small_disp_combobox event is =11(QEvent::Leave)
small_disp_combobox event is =128(QEvent::HoverLeave)
small_disp_combobox event is =12(QEvent::Paint)
small_disp_combobox event is =12(QEvent::Paint)
4):再次点击small_disp_combobox,产生的事件有(没有自动收回):
1small_disp_combobox event is =0(QEvent::Enter)
small_disp_combobox event is =127(QEvent::HoverEnter)
small_disp_combobox event is =129(QEvent::HoverMove)
small_disp_combobox event is =129(QEvent::HoverMove)
small_disp_combobox event is =2(QEvent::MouseButtonPress)
small_disp_combobox event is =9(QEvent::FocusOut)
small_disp_combobox event is =12(QEvent::Paint)
small_disp_combobox event is =12(QEvent::Paint)
small_disp_combobox event is =129(QEvent::HoverMove)
small_disp_combobox event is =12(QEvent::Paint)
small_disp_combobox event is =12(QEvent::Paint)
5):再次点击item,产生的事件有:
small_disp_combobox event is =11(QEvent::Leave)
small_disp_combobox event is =128(QEvent::HoverLeave)
small_disp_combobox event is =12(QEvent::Paint)
small_disp_combobox event is =12(QEvent::Paint)
6):再次点击small_disp_combobox,产生的事件有(自动收回):
small_disp_combobox event is = 10(entry)
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 = 11(QEvent::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示意图(点击它之后文字只有一部分被选中,正常情况是全部选中)