Qt中父子widget的消息传递

探讨了在Qt中子控件点击事件如何影响父控件的事件处理。通过具体实验对比了QLabel与QPushButton的不同表现,揭示了事件传递机制,并讨论了事件接受与忽略对传递的影响。

以前我一直以为:在父widget上摆一个子widget后,当click子widget时:只会进入到子widget的相关事件处理函数中,比如进入到mousePressEvent()中, 而不会进入到父widget的对应事件处理函数中。毕竟:click的是子widget,其遮挡住了父widget,从而父widget接收不到这个事件。然而事实真的是这个样子吗?

我做了一个测试: 在一个QWidget上建了一个QLabel。而后实现父QWidget的mousePressEvent(), 然后跟一下发现:当我click这个label时:居然能进入到父QWidget的mousePressEvent()中!但是如果把子改成QPushButton则进入不了!


咨询了一下别人,得到的答案是:如果子widget没有accept或ignore该事件,则该事件会被传递给其父亲。


事实也确实如此:

①对于QLabel: 如果不重写mouse处理函数,也没有设置事件过滤器等操作的话,则相当于:其对mouse这个事件一直没有进行处理,那没有进行处理的话,相当于上边所说的情况,此时该事件会被传递给其parent。

②而对于QPushButton而言:当click它时:其会发射clicked()信号,其实这就相当于它对该事件的一个operator过程。所以:这里它accept该事件并进行了对应处理。从而:无法传递给其父窗口。



那么:对于一个继承而来的类,只要我们重写实现了其各个事件处理函数,则对应的事件肯定无法传递给其父widget! 哪怕重写的该事件处理函数的函数体为空!


如果是标准的控件对象,则其肯定没重写各个事件处理函数。那消息能不能传递到父widget中,则取决于中途有没有使用事件过滤器等将该信号拦截下来了。

在使用 Qt 的 `QListWidget` 时,调用 `setItemWidget` 后自定义的 widget 不显示,通常是由以下几个原因导致的: ### 1. widget 已被其他 item 绑定 在调用 `setItemWidget` 时,如果传入的 widget 已经被绑定到其他 `QListWidgetItem`,该 widget 会被从之前的 item 中移除并删除[^1]。因此,即使尝试将其绑定到新的 item 上,该 widget 已经不可用,导致无法显示。 **解决方案:** 确保每次绑定前,widget 没有被绑定到其他 item。可以为每个 item 创建一个新的 widget 实例,而不是复用已有的 widget。 ```cpp QListWidgetItem *item = new QListWidgetItem(ui->listWidget); QLineEdit *lineEdit = new QLineEdit("New Item"); ui->listWidget->setItemWidget(item, lineEdit); ``` ### 2. widget 的父对象设置问题 如果手动创建 widget 时设置了父对象(例如传递了父级 QObject),可能导致 widget 无法正确显示,因为 `QListWidget` 无法接管其生命周期管理。 **解决方案:** 创建 widget 时不要指定父对象,让 `QListWidget` 自动管理 widget父子关系。 ```cpp QLineEdit *lineEdit = new QLineEdit("No Parent"); ``` ### 3. widget 的大小策略或布局问题 某些 widget 的默认大小策略(`sizePolicy`)可能不适合 `QListWidgetItem` 的显示区域,导致 widget 被压缩或隐藏。 **解决方案:** 调整 widget 的大小策略,确保其可以适应 `QListWidgetItem` 的布局。 ```cpp lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); ``` 此外,可以通过设置 `QListWidgetItem` 的大小来适应 widget 的需求: ```cpp item->setSizeHint(lineEdit->sizeHint()); ``` ### 4. widget 被隐藏或样式问题 某些情况下,widget 可能因为样式设置或显隐状态而未被正确显示。 **解决方案:** 确保 widget 被显式调用 `show()`,或者检查是否存在样式表影响了 widget 的外观。 ```cpp lineEdit->show(); ``` ### 5. QListWidget 的视图模式不支持嵌入 widget `QListWidget` 默认支持嵌入 widget,但如果在某些特定的视图模式或布局中使用,可能会影响 widget 的显示。 **解决方案:** 确保没有对 `QListWidget` 进行特殊的视图模式设置,例如设置为图标模式时可能影响 widget 的正常显示。 ```cpp ui->listWidget->setViewMode(QListView::ListMode); // 确保使用列表模式 ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值