请教QT前辈的问题(QT事件传递)

pengzhihui2012 2013-09-30 02:40:41
首先介绍一下本人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的前辈提出意见和建议。

...全文
769 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaodiqiu2010 2013-12-02
  • 打赏
  • 举报
回复
我想知道QComboBox,我把他右侧按钮改宽之后,lineEdit的右边框虚线被变宽的按钮遮挡了,怎么办
xiaodiqiu2010 2013-12-02
  • 打赏
  • 举报
回复
能加个QQ请教个问题嘛,猫头大神..我扣扣302920749@qq.com
pengzhihui2012 2013-12-02
  • 打赏
  • 举报
回复
自动收回的意思:点击combobox,它会弹出下拉框,之后1秒左右这个下拉框就自动收回了
zhxianbin 2013-11-23
  • 打赏
  • 举报
回复
QComboBox{color:white; background-color: rgba(0, 0, 0, 0); border-radius:2px; border: 2px groove gray;} QComboBox::drop-down{background-color: rgba(0, 0, 0, 0); width:40px;} QComboBox::down-arrow{image: url(:/images/16x16/down-arrow.png)}
影子灬漂流 2013-11-23
  • 打赏
  • 举报
回复
1描述:我用的是4.8.4版本,就是QCombBox鼠标单击小三角弹出下拉框字体默认黑色,鼠标移到item背景变蓝,字体变成白色;单击item下拉框之后,comboBox文本读取点击的item,背景同样成蓝色,字体变白;这是正常控件运行效果; 2:问题:我这样QComboBox{padding-right:0px;} QComboBox:drop-down{width:40px;} 设置右侧按钮宽度之后,发现点击item之后,comboBox的文本背景变成蓝色,单字体没变白色;这怎么办呀; 3:目的:使用comboBox默然控件样式,只是想让右侧小三角按钮随着能同比例缩放; 4:那个comboBox的小三角按钮的单击事件是什么呀 5:我刚接触QT,工作急需,懂的话能加QQ详细聊下嘛,解决有肉吃呀;QQ:302920749
zhxianbin 2013-11-22
  • 打赏
  • 举报
回复
什么qt版本?qt5.1 好像有点问题
zhxianbin 2013-11-22
  • 打赏
  • 举报
回复
这个ComBoBox不自动收回,但是一到工程中就自动收回? 没看明白什么意思
影子灬漂流 2013-11-22
  • 打赏
  • 举报
回复
1:这个大哥问个问题,我在调整QComboBox宽度之后,发现点击下拉按钮收回来的时候字体是黑色的颜色不会变成白色了,怎么回事;代码是: QComboBox{padding-right:0px;} QComboBox:drop-down{width:40px;} 2:那个下拉按钮小三角的点击事件是什么呀(鼠标点击小三角触发的事件),跪求呀,有代码最好,邮箱:302920749@q.com
pengzhihui2012 2013-10-30
  • 打赏
  • 举报
回复
我用的是linux2.6.35+QT4.8.2,很奇怪的是我按照我的架构做了一个小的实验(页面中的控件很少,就一个button、一个label和一个combobox),这个ComBoBox不自动收回,但是一到工程中就自动收回,哎....
91program 2013-10-06
  • 打赏
  • 举报
回复
如果是用 Linux,建议 LZ 去 Linux 论坛里问问,这里主要是搞 WinCE 的。
亥尚 2013-10-05
  • 打赏
  • 举报
回复
引用 3 楼 91program 的回复:
[quote=引用 2 楼 u010670794 的回复:] 现在项目中用的较多的图形界面是什么?Android?GTK?Qt?哪一个?
LZ,你是什么系统呢?[/quote] 我现在是学习啊。。。各种用。不过大部分使用linux。。。
亥尚 2013-10-05
  • 打赏
  • 举报
回复
我现在是学习啊。。。各种用。不过大部分使用linux。。。
91program 2013-10-05
  • 打赏
  • 举报
回复
引用 2 楼 u010670794 的回复:
现在项目中用的较多的图形界面是什么?Android?GTK?Qt?哪一个?
LZ,你是什么系统呢?
亥尚 2013-10-04
  • 打赏
  • 举报
回复
现在项目中用的较多的图形界面是什么?Android?GTK?Qt?哪一个?
91program 2013-10-01
  • 打赏
  • 举报
回复
QT 用的人比较少,大多数时间只能靠自己研究

19,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧