引子:每一个桌面应用程序或多或少的使用了按钮,而使用Qt自定义按钮几乎随处可见。

问题:当在父窗口中创建按钮后,经常需要点击按钮同时响应父窗口与按钮绑定的两个操作(甚至更多)。而自定义按钮类将鼠标按下事件传递至父窗口时,往往碰到按钮点击失效的问题。

解决方案:

1.根据需求自定义按钮类(以QToolButton为例)

 1 class MyButton(QtGui.QToolButton): 2     '''自定义按钮类''' 3     ############################## 构造、析构函数 ################################## 4     def __init__(self,parent=None): 5         '''构造函数''' 6         # 调用父类构造函数 7         super(MyButton,self).__init__(parent) 8         # 设置按钮尺寸 9         self.setFixedSize(QtCore.QSize(800,120))10         # 设置按钮背景颜色11         self.setStyleSheet('''background-color:red;''')12     ################################ 事件 #########################################13     def mousePressEvent(self,event):14         '''鼠标按下事件'''15         # 判断是否为鼠标左键按下16         if event.button() == QtCore.Qt.LeftButton:17             # 传递至父窗口响应鼠标按下事件18             self.parent().mousePressEvent(event)

2.在主窗口中添加按钮,点击按钮先弹出对话框,然后设置主窗口背景颜色

 1 class MyWindow(QtGui.QWidget): 2     '''自定义窗口类''' 3     ############################# 构造、析构函数 ################################# 4     def __init__(self,parent=None): 5         '''构造函数''' 6         # 调用父类构造函数 7         super(MyWindow,self).__init__(parent) 8         # 设置窗口固定尺寸 9         self.setFixedSize(QtCore.QSize(800,600))10         # 创建主控件11         bodyWidget = QtGui.QWidget(self)12         # 创建主布局13         mainLayout = QtGui.QVBoxLayout(bodyWidget)14         # 遍历创建按钮15         for i in range(4):16             # 创建自定义按钮17             button = MyButton(self)18             # 设置文本内容19             button.setText("测试%s" % i)20             # 添加控件21             mainLayout.addWidget(button)22             # 设置按钮点击连接槽函数23             button.clicked.connect(self.OnClick)24     ############################### 命令 ########################################25     def OnClick(self):26         '''响应点击'''27         QtGui.QMessageBox.about(self,"测试","点击弹出窗口成功")28     ################################ 事件 ########################################29     def mousePressEvent(self,event):30         '''鼠标按下事件'''31         # 判断是否为鼠标左键按下32         if event.button() == QtCore.Qt.LeftButton:33             # 设置窗口背景颜色34             self.setStyleSheet('''background-color:cyan;''')

实际运行效果并没用弹出对话框,因为按钮点击失效

3.解决办法:在自定义按钮类的鼠标按下事件函数中,当判断为鼠标左键按下后,发送按钮发送点击信号

1 def mousePressEvent(self,event):2     '''鼠标按下事件'''3     # 判断是否为鼠标左键按下4     if event.button() == QtCore.Qt.LeftButton:5       # 发射点击信号6        self.clicked.emit(True)7        # 传递至父窗口响应鼠标按下事件8        self.parent().mousePressEvent(event)

运行效果如下:

4.完整示例代码:

 1 # coding=gbk 2  3 # 导入模块 4 import sys 5 from PyQt4 import QtGui,QtCore 6  7 ################################# 自定义窗口类 ##################################### 8 class MyWindow(QtGui.QWidget): 9     '''自定义窗口类'''10     ############################# 构造、析构函数 #################################11     def __init__(self,parent=None):12         '''构造函数'''13         # 调用父类构造函数14         super(MyWindow,self).__init__(parent)15         # 设置窗口固定尺寸16         self.setFixedSize(QtCore.QSize(800,600))17         # 创建主控件18         bodyWidget = QtGui.QWidget(self)19         # 创建主布局20         mainLayout = QtGui.QVBoxLayout(bodyWidget)21         # 遍历创建按钮22         for i in range(4):23             # 创建自定义按钮24             button = MyButton(self)25             # 设置文本内容26             button.setText("测试%s" % i)27             # 添加控件28             mainLayout.addWidget(button)29             # 设置按钮点击连接槽函数30             button.clicked.connect(self.OnClick)31     ############################### 命令 ########################################32     def OnClick(self):33         '''响应点击'''34         QtGui.QMessageBox.about(self,"测试","点击弹出窗口成功")35     ################################ 事件 ########################################36     def mousePressEvent(self,event):37         '''鼠标按下事件'''38         # 判断是否为鼠标左键按下39         if event.button() == QtCore.Qt.LeftButton:40             # 设置窗口背景颜色41             self.setStyleSheet('''background-color:cyan;''')42         43 ################################## 自定义按钮类 ####################################44 class MyButton(QtGui.QToolButton):45     '''自定义按钮类'''46     ############################## 构造、析构函数 ##################################47     def __init__(self,parent=None):48         '''构造函数'''49         # 调用父类构造函数50         super(MyButton,self).__init__(parent)51         # 设置按钮尺寸52         self.setFixedSize(QtCore.QSize(800,120))53         # 设置按钮背景颜色54         self.setStyleSheet('''background-color:red;''')55     ################################ 事件 #########################################56     def mousePressEvent(self,event):57         '''鼠标按下事件'''58         # 判断是否为鼠标左键按下59         if event.button() == QtCore.Qt.LeftButton:60             # 发射点击信号61             self.clicked.emit(True)62             # 传递至父窗口响应鼠标按下事件63             self.parent().mousePressEvent(event)64         65 ################################## 主函数 ##########################################66 if __name__ == "__main__":67     '''主函数'''68     # 声明变量69     app = QtGui.QApplication(sys.argv)70     # 创建窗口71     window = MyWindow()72     # 设置窗口显示73     window.show()74     #应用程序事件循环75     sys.exit(app.exec_())

转载于:https://www.cnblogs.com/caomingongli/archive/2011/09/20/2181961.html

PyQt之按钮传递鼠标按下事件点击失效相关推荐

  1. 用鼠标按下事件和鼠标松开事件实现长按事件

    用鼠标按下事件和鼠标松开事件实现长按事件 我这次要分享的是,用鼠标按下事件(onmousedown)和鼠标松开事件(onmouseup)实现长按事件,在这个长按事件里面我让它实现让数值自增的功能.首先 ...

  2. 数据传递型情景下事件机制与消息机制的架构设计剖析(目录)

    目录 数据传递型情景下事件机制与消息机制的架构设计剖析(一) 转载于:https://www.cnblogs.com/hailan/p/3616766.html

  3. Qt:鼠标事件(鼠标移动事件、鼠标按下事件、鼠标释放事件、进入窗口区域、离开窗口区域)

    鼠标事件,本质是重写重写QWidgt中虚函数. 以下程序是获取鼠标坐标: mylabel.h #ifndef MYLABEL_H #define MYLABEL_H #include <QLab ...

  4. LabVIEW中利用事件结构演示用鼠标单击前面板窗口时,发生鼠标按下事件并处理鼠标按下事件

    前面板 程序框图 

  5. js 鼠标按下并移动事件

    html源码: <divonMouseDown={(e) =>fn1(e)}onMouseUp={(e)=>fn2(e)}>内容</div> js源码 fn1(ev ...

  6. 【Qt】QT鼠标和键盘事件

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 鼠标事件 04. 键盘事件 05. 附录 01. 概述 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者 ...

  7. PyQt实现按钮控件的拖动效果,利用鼠标移动事件实现。

    文章目录 原理 代码 原理 1.利用mousePressEvent记录下鼠标按下时在控件上的相对位置: 2.利用mouseMoveEvent记录下鼠标移动中的位置,并且将控件移动到那个位置.不过要当心 ...

  8. 鼠标点击触发事件python_如何在鼠标按下的情况下触发tkinter的“Enter”事件?...

    在tkinter with Python3.7中,事件绑定的默认行为是在释放鼠标之前单击鼠标后不会触发"&lt:Enter&gt:"事件.我打算实现一个可滚动表,这 ...

  9. WPF:MouseDown、MouseUP事件,鼠标按下不起作用

    后台代码设置按钮按下.释放的事件 通常我们会为按钮btn添加MouseDownEvent和MouseUpEvent事件,,如下: public MainWindow() {InitializeComp ...

  10. Pyqt学习笔记(1) ----- 创建按钮,并添加单击事件

    Pyqt学习笔记(1) ----- 创建按钮,并添加单击事件 from PyQt5 import QtCore, QtGui, QtWidgets import sys from PyQt5.QtGu ...

最新文章

  1. 记一次解题思路(周起始日)
  2. 展开被 SpringBoot 玩的日子 《 二 》 WEB 开发
  3. python基础语法 第0关print-徐州鼓楼高校邦数据科学通识课【Python基础语法】答案...
  4. sessionbean entitybean 区别
  5. 30个Python极简代码,10分钟get常用技巧!
  6. gem5的安装、编译及运行
  7. 目录:关于【稳定性建设之道】大纲速览
  8. 何把SATA/RAID驱动集成到win xp 安装盘里?
  9. JZOJ 4230. 淬炼神体
  10. 东南卫视肌肤食品微商套路解析
  11. dnmp一键部署搞定的php开发环境基于Docker的LNMP一键安装程序
  12. 微信公众号推送模板消息(四):Java调用实现模板消息推送
  13. Flask框架flash消息闪现学习与优化符合闪现之名#华为云·寻找黑马程序员#
  14. 如何让客户接受你的价格比别人更高?
  15. leetcode 1925. Count Square Sum Triples(python)
  16. 黄花城之行-未到四海
  17. 安装Mozilla Firefox
  18. 腾讯地图html代码,腾讯地图API使用参考.html
  19. 制造业质量工程师转行软件测试
  20. compare_exchange_weak

热门文章

  1. 深度学习TF—7.卷积神经网络CNN
  2. 深度学习2.0-14.神经网络与全连接层之全连接层、输出方式、误差计算
  3. pytorch 中nn.MaxPool1d() 和nn.MaxPool2d()对比
  4. 吴恩达深度学习——超参数调优
  5. 云原生时代,需要什么样的数据库?
  6. 敏捷数据科学:用Hadoop创建数据分析应用
  7. Activity调度机制
  8. 8.6 归纳式迁移学习
  9. 1.1 文本表示——离散形式表示
  10. php如何架构设计,PHP – 架构设计帮助 – OOP固体原则