• PyQt5 控件学习(一个一个学习之QPushButton)


    前言:

    说完了拥有按钮共性的抽象类QAbstractButton之后,接下来就是具体了看下它的子类:

    首先是QPushButton

    QPushButton描述:

    QPushButton功能作用:

    一:QPushButton 功能作用之创建按钮:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 
     5 class Btn(QPushButton):
     6     # def hitButton(self, QPoint):
     7     def hitButton(self, point):
     8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     9         cir_x = self.width()/2
    10         cir_y = self.height()/2
    11 
    12         hit_x = point.x()
    13         hit_y = point.y()
    14 
    15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
    16             return False
    17         return True
    18 ############################画内切圆###############################
    19     def paintEvent(self, event):
    20         ###########################################################
    21         super().paintEvent(event)
    22         ###########################################################
    23 
    24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
    25         #这时就有了画家和 纸
    26 
    27         #给画家支笔
    28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
    29         painter.setPen(pen)
    30 
    31 
    32         #画家开始画
    33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
    34 ############################画内切圆###############################
    35 
    36 
    37 #1,创建app
    38 app  = QApplication(sys.argv)
    39 
    40 
    41 #2,控件的操作:
    42 #创建控件
    43 window = QWidget()
    44 
    45 
    46 #设置控件
    47 window.setWindowTitle("QAbstactButton 有效区域")
    48 window.resize(500,500)
    49 
    50 ############################QPushButton的构造函数###############################
    51 #两种方式:
    52 # 第一种
    53     # btn = QPushButton()
    54     # btn.setParent(window)
    55     # btn.setText("xxx")
    56     # btn.setIcon(QIcon("icon.ico"))
    57 #第二种:
    58 # btn = QPushButton(QIcon("icon.ico"),"xxx",window)  #一步搞定
    59 
    60 #我喜欢的方式:
    61 btn = QPushButton(window)
    62 btn.setText("xxx")
    63 btn.setIcon(QIcon("icon.ico"))
    64 
    65 
    66 ############################QPushButton的构造函数###############################
    67 
    68 
    69 
    70 #展示控件
    71 window.show()
    72 
    73 #3,进入消息循环
    74 sys.exit(app.exec_())
    QPushButton的构造函数

    二:QPushButton 功能作用之菜单:

    API

    这里要先补充QMenu:

    它的继承图:

      1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
      2 import sys
      3 
      4 
      5 class Btn(QPushButton):
      6     # def hitButton(self, QPoint):
      7     def hitButton(self, point):
      8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
      9         cir_x = self.width()/2
     10         cir_y = self.height()/2
     11 
     12         hit_x = point.x()
     13         hit_y = point.y()
     14 
     15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
     16             return False
     17         return True
     18 ############################画内切圆###############################
     19     def paintEvent(self, event):
     20         ###########################################################
     21         super().paintEvent(event)
     22         ###########################################################
     23 
     24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
     25         #这时就有了画家和 纸
     26 
     27         #给画家支笔
     28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
     29         painter.setPen(pen)
     30 
     31 
     32         #画家开始画
     33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
     34 ############################画内切圆###############################
     35 
     36 
     37 #1,创建app
     38 app  = QApplication(sys.argv)
     39 
     40 
     41 #2,控件的操作:
     42 #创建控件
     43 window = QWidget()
     44 
     45 
     46 #设置控件
     47 window.setWindowTitle("QAbstactButton 有效区域")
     48 window.resize(500,500)
     49 
     50 
     51 btn = QPushButton(window)
     52 btn.setText("xxx")
     53 btn.setIcon(QIcon("icon.ico"))
     54 
     55 ############################菜单的设置###############################
     56 
     57 menu = QMenu()
     58 
     59 #菜单之行为动作 新建,打开
     60 new_action = QAction(menu)  # 父控件是menu
     61 new_action.setText("新建")
     62 new_action.setIcon(QIcon("icon.ico"))
     63 new_action.triggered.connect(lambda :print("新建文件"))
     64 
     65 open_action = QAction(menu)  # 父控件是menu
     66 open_action.setText("打开")
     67 open_action.setIcon(QIcon("icon.ico"))
     68 open_action.triggered.connect(lambda :print("打开文件"))
     69 
     70 exit_action = QAction(menu)  # 父控件是menu
     71 exit_action.setText("退出")
     72 exit_action.setIcon(QIcon("icon.ico"))
     73 exit_action.triggered.connect(lambda :print("退出"))
     74 
     75 menu.addAction(new_action)
     76 menu.addAction(open_action)
     77 menu.addAction(exit_action)
     78 
     79 menu.addSeparator()
     80 #菜单之子菜单   最近打开
     81 
     82 sub_menu = QMenu(menu)
     83 sub_menu.setTitle("最近打开 ")  # 注意不是steText
     84 sub_menu.setIcon(QIcon("icon.ico"))
     85 
     86 file_action = QAction("Python gui 编程 PyQt5")
     87 sub_menu.addAction(file_action)
     88 
     89 
     90 menu.addMenu(sub_menu)
     91 
     92 
     93 btn.setMenu(menu)
     94 
     95 ############################菜单的设置###############################
     96 
     97 
     98 
     99 #展示控件
    100 window.show()
    101 
    102 #3,进入消息循环
    103 sys.exit(app.exec_())
    自己模拟个菜单

    使用btn.showMenu() 展示菜单,

    一:在window 前使用它

      1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
      2 import sys
      3 
      4 
      5 class Btn(QPushButton):
      6     # def hitButton(self, QPoint):
      7     def hitButton(self, point):
      8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
      9         cir_x = self.width()/2
     10         cir_y = self.height()/2
     11 
     12         hit_x = point.x()
     13         hit_y = point.y()
     14 
     15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
     16             return False
     17         return True
     18 ############################画内切圆###############################
     19     def paintEvent(self, event):
     20         ###########################################################
     21         super().paintEvent(event)
     22         ###########################################################
     23 
     24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
     25         #这时就有了画家和 纸
     26 
     27         #给画家支笔
     28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
     29         painter.setPen(pen)
     30 
     31 
     32         #画家开始画
     33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
     34 ############################画内切圆###############################
     35 
     36 
     37 #1,创建app
     38 app  = QApplication(sys.argv)
     39 
     40 
     41 #2,控件的操作:
     42 #创建控件
     43 window = QWidget()
     44 
     45 
     46 #设置控件
     47 window.setWindowTitle("QAbstactButton 有效区域")
     48 window.resize(500,500)
     49 
     50 
     51 btn = QPushButton(window)
     52 btn.setText("xxx")
     53 btn.setIcon(QIcon("icon.ico"))
     54 
     55 ############################菜单的设置###############################
     56 
     57 menu = QMenu()
     58 
     59 #菜单之行为动作 新建,打开
     60 new_action = QAction(menu)  # 父控件是menu
     61 new_action.setText("新建")
     62 new_action.setIcon(QIcon("icon.ico"))
     63 new_action.triggered.connect(lambda :print("新建文件"))
     64 
     65 open_action = QAction(menu)  # 父控件是menu
     66 open_action.setText("打开")
     67 open_action.setIcon(QIcon("icon.ico"))
     68 open_action.triggered.connect(lambda :print("打开文件"))
     69 
     70 exit_action = QAction(menu)  # 父控件是menu
     71 exit_action.setText("退出")
     72 exit_action.setIcon(QIcon("icon.ico"))
     73 exit_action.triggered.connect(lambda :print("退出"))
     74 
     75 menu.addAction(new_action)
     76 menu.addAction(open_action)
     77 menu.addAction(exit_action)
     78 
     79 menu.addSeparator()
     80 #菜单之子菜单   最近打开
     81 
     82 sub_menu = QMenu(menu)
     83 sub_menu.setTitle("最近打开 ")  # 注意不是steText
     84 sub_menu.setIcon(QIcon("icon.ico"))
     85 
     86 file_action = QAction("Python gui 编程 PyQt5")
     87 sub_menu.addAction(file_action)
     88 
     89 
     90 menu.addMenu(sub_menu)
     91 
     92 
     93 btn.setMenu(menu)
     94 
     95 ############################菜单的设置###############################
     96 
     97 
     98 
     99 ###########################################################
    100 btn.showMenu()  #此时,先展示的是菜单,它可以独自展示的,因为它直接继承的QWidget
    101 ###########################################################
    102 
    103 
    104 #展示控件
    105 window.show()
    106 
    107 #3,进入消息循环
    108 sys.exit(app.exec_())
    View Code

    二:在window 后使用它

      1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
      2 import sys
      3 
      4 
      5 class Btn(QPushButton):
      6     # def hitButton(self, QPoint):
      7     def hitButton(self, point):
      8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
      9         cir_x = self.width()/2
     10         cir_y = self.height()/2
     11 
     12         hit_x = point.x()
     13         hit_y = point.y()
     14 
     15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
     16             return False
     17         return True
     18 ############################画内切圆###############################
     19     def paintEvent(self, event):
     20         ###########################################################
     21         super().paintEvent(event)
     22         ###########################################################
     23 
     24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
     25         #这时就有了画家和 纸
     26 
     27         #给画家支笔
     28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
     29         painter.setPen(pen)
     30 
     31 
     32         #画家开始画
     33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
     34 ############################画内切圆###############################
     35 
     36 
     37 #1,创建app
     38 app  = QApplication(sys.argv)
     39 
     40 
     41 #2,控件的操作:
     42 #创建控件
     43 window = QWidget()
     44 
     45 
     46 #设置控件
     47 window.setWindowTitle("QAbstactButton 有效区域")
     48 window.resize(500,500)
     49 
     50 
     51 btn = QPushButton(window)
     52 btn.setText("xxx")
     53 btn.setIcon(QIcon("icon.ico"))
     54 
     55 ############################菜单的设置###############################
     56 
     57 menu = QMenu()
     58 
     59 #菜单之行为动作 新建,打开
     60 new_action = QAction(menu)  # 父控件是menu
     61 new_action.setText("新建")
     62 new_action.setIcon(QIcon("icon.ico"))
     63 new_action.triggered.connect(lambda :print("新建文件"))
     64 
     65 open_action = QAction(menu)  # 父控件是menu
     66 open_action.setText("打开")
     67 open_action.setIcon(QIcon("icon.ico"))
     68 open_action.triggered.connect(lambda :print("打开文件"))
     69 
     70 exit_action = QAction(menu)  # 父控件是menu
     71 exit_action.setText("退出")
     72 exit_action.setIcon(QIcon("icon.ico"))
     73 exit_action.triggered.connect(lambda :print("退出"))
     74 
     75 menu.addAction(new_action)
     76 menu.addAction(open_action)
     77 menu.addAction(exit_action)
     78 
     79 menu.addSeparator()
     80 #菜单之子菜单   最近打开
     81 
     82 sub_menu = QMenu(menu)
     83 sub_menu.setTitle("最近打开 ")  # 注意不是steText
     84 sub_menu.setIcon(QIcon("icon.ico"))
     85 
     86 file_action = QAction("Python gui 编程 PyQt5")
     87 sub_menu.addAction(file_action)
     88 
     89 
     90 menu.addMenu(sub_menu)
     91 
     92 
     93 btn.setMenu(menu)
     94 
     95 ############################菜单的设置###############################
     96 
     97 
     98 #展示控件
     99 window.show()
    100 
    101 ###########################################################
    102 btn.showMenu()  #此时,先展示的是窗口,然后再展示菜单
    103 ###########################################################
    104 
    105 
    106 #3,进入消息循环
    107 sys.exit(app.exec_())
    View Code

    三:QPushButton 功能作用之边框是否保持扁平:

     

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 
     5 class Btn(QPushButton):
     6     # def hitButton(self, QPoint):
     7     def hitButton(self, point):
     8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     9         cir_x = self.width()/2
    10         cir_y = self.height()/2
    11 
    12         hit_x = point.x()
    13         hit_y = point.y()
    14 
    15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
    16             return False
    17         return True
    18 ############################画内切圆###############################
    19     def paintEvent(self, event):
    20         ###########################################################
    21         super().paintEvent(event)
    22         ###########################################################
    23 
    24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
    25         #这时就有了画家和 纸
    26 
    27         #给画家支笔
    28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
    29         painter.setPen(pen)
    30 
    31 
    32         #画家开始画
    33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
    34 ############################画内切圆###############################
    35 
    36 
    37 #1,创建app
    38 app  = QApplication(sys.argv)
    39 
    40 
    41 #2,控件的操作:
    42 #创建控件
    43 window = QWidget()
    44 
    45 
    46 #设置控件
    47 window.setWindowTitle("QAbstactButton 有效区域")
    48 window.resize(500,500)
    49 
    50 
    51 btn = QPushButton(window)
    52 btn.setText("xxx")
    53 btn.setIcon(QIcon("icon.ico"))
    54 
    55 ############################边框是否扁平化###############################
    56 print(btn.isFlat())  #false
    57 
    58 btn.setFlat(True)  # 这时的按钮就不再凸起了
    59 
    60 ############################边框是否扁平化###############################
    61 
    62 
    63 
    64 #展示控件
    65 window.show()
    66 
    67 
    68 
    69 
    70 #3,进入消息循环
    71 sys.exit(app.exec_())
    View Code

    需要注意的是,如果之前有设置背景颜色的话,如果我们后面又设置了扁平化的话,那么背景颜色就不再绘制了。

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 
     5 class Btn(QPushButton):
     6     # def hitButton(self, QPoint):
     7     def hitButton(self, point):
     8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     9         cir_x = self.width()/2
    10         cir_y = self.height()/2
    11 
    12         hit_x = point.x()
    13         hit_y = point.y()
    14 
    15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
    16             return False
    17         return True
    18 ############################画内切圆###############################
    19     def paintEvent(self, event):
    20         ###########################################################
    21         super().paintEvent(event)
    22         ###########################################################
    23 
    24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
    25         #这时就有了画家和 纸
    26 
    27         #给画家支笔
    28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
    29         painter.setPen(pen)
    30 
    31 
    32         #画家开始画
    33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
    34 ############################画内切圆###############################
    35 
    36 
    37 #1,创建app
    38 app  = QApplication(sys.argv)
    39 
    40 
    41 #2,控件的操作:
    42 #创建控件
    43 window = QWidget()
    44 
    45 
    46 #设置控件
    47 window.setWindowTitle("QAbstactButton 有效区域")
    48 window.resize(500,500)
    49 
    50 
    51 btn = QPushButton(window)
    52 btn.setText("xxx")
    53 btn.setIcon(QIcon("icon.ico"))
    54 
    55 ############################扁平化使背景颜色不再绘制###############################
    56 btn.setStyleSheet("background-color:red;")
    57 btn.setFlat(True)  # 这时就不再有背景颜色了
    58 
    59 ############################扁平化使背景颜色不再绘制###############################
    60 
    61 
    62 
    63 #展示控件
    64 window.show()
    65 
    66 
    67 
    68 
    69 #3,进入消息循环
    70 sys.exit(app.exec_())
    View Code

    三:QPushButton 功能作用之默认处理:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 
     5 class Btn(QPushButton):
     6     # def hitButton(self, QPoint):
     7     def hitButton(self, point):
     8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     9         cir_x = self.width()/2
    10         cir_y = self.height()/2
    11 
    12         hit_x = point.x()
    13         hit_y = point.y()
    14 
    15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
    16             return False
    17         return True
    18 ############################画内切圆###############################
    19     def paintEvent(self, event):
    20         ###########################################################
    21         super().paintEvent(event)
    22         ###########################################################
    23 
    24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
    25         #这时就有了画家和 纸
    26 
    27         #给画家支笔
    28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
    29         painter.setPen(pen)
    30 
    31 
    32         #画家开始画
    33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
    34 ############################画内切圆###############################
    35 
    36 
    37 #1,创建app
    38 app  = QApplication(sys.argv)
    39 
    40 
    41 #2,控件的操作:
    42 #创建控件
    43 window = QWidget()
    44 
    45 
    46 #设置控件
    47 window.setWindowTitle("QAbstactButton 有效区域")
    48 window.resize(500,500)
    49 
    50 
    51 btn = QPushButton(window)
    52 btn.setText("xxx")
    53 btn.setIcon(QIcon("icon.ico"))
    54 
    55 btn2 = QPushButton(window)
    56 btn2.setText("btn2")
    57 btn2.move(200,200)
    58 
    59 ############################默认处理###############################
    60 btn2.setAutoDefault(True)  #鼠标点击之后再会被设置为默认
    61 
    62 print(btn.autoDefault())  #false
    63 print(btn2.autoDefault())  #true
    64 
    65 ############################默认处理###############################
    66 
    67 
    68 
    69 
    70 #展示控件
    71 window.show()
    72 
    73 
    74 
    75 
    76 #3,进入消息循环
    77 sys.exit(app.exec_())
    View Code
     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 
     5 class Btn(QPushButton):
     6     # def hitButton(self, QPoint):
     7     def hitButton(self, point):
     8         print(point)  #用户点击按钮之后,这个函数会将用户点击的点传出来
     9         cir_x = self.width()/2
    10         cir_y = self.height()/2
    11 
    12         hit_x = point.x()
    13         hit_y = point.y()
    14 
    15         if pow(hit_x-cir_x,2)+pow(hit_y-cir_y,2) >pow(self.width()/2,2):
    16             return False
    17         return True
    18 ############################画内切圆###############################
    19     def paintEvent(self, event):
    20         ###########################################################
    21         super().paintEvent(event)
    22         ###########################################################
    23 
    24         painter = QPainter(self) # 它里面的参数是 QPaintDevice “纸”,所有控件都可以当做纸,因为QWidget也继承了QPaintDevice
    25         #这时就有了画家和 纸
    26 
    27         #给画家支笔
    28         pen = QPen(QColor(100,10,155),4)  #笔的颜色和宽度
    29         painter.setPen(pen)
    30 
    31 
    32         #画家开始画
    33         painter.drawEllipse(self.rect()) #这就是两个点,四个值
    34 ############################画内切圆###############################
    35 
    36 
    37 #1,创建app
    38 app  = QApplication(sys.argv)
    39 
    40 
    41 #2,控件的操作:
    42 #创建控件
    43 window = QWidget()
    44 
    45 
    46 #设置控件
    47 window.setWindowTitle("QAbstactButton 有效区域")
    48 window.resize(500,500)
    49 
    50 
    51 btn = QPushButton(window)
    52 btn.setText("xxx")
    53 btn.setIcon(QIcon("icon.ico"))
    54 
    55 btn2 = QPushButton(window)
    56 btn2.setText("btn2")
    57 btn2.move(200,200)
    58 
    59 ############################默认处理###############################
    60 
    61 btn2.setDefault(True)  # 直接就是默认的了
    62 
    63 ############################默认处理###############################
    64 
    65 
    66 
    67 
    68 #展示控件
    69 window.show()
    70 
    71 
    72 
    73 
    74 #3,进入消息循环
    75 sys.exit(app.exec_())
    view code

    它的应用场景主要在对话框中,当我们打开一个对话框之后,可以设置默认处理的按钮。

    QPushButton信号:

    它的信号基本上都是继承下来的。

    基本上都说过了,其他的,

    说这个信号:

    自定义上下文菜单请求信号

    下面我们通过需求:右键菜单来学习它这个信号:

    其实右键菜单会调用对象方法contextMenuEvent() ,我们要重写它,

    先继承,再重写:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Window(QWidget):
     5     def contextMenuEvent(self, QContextMenuEvent):
     6         print("展示菜单")
     7 
     8 
     9 #1,创建app
    10 app  = QApplication(sys.argv)
    11 
    12 
    13 #2,控件的操作:
    14 #创建控件
    15 window = Window()
    16 
    17 
    18 #设置控件
    19 window.setWindowTitle("QAbstactButton 有效区域")
    20 window.resize(500,500)
    21 
    22 
    23 btn = QPushButton(window)
    24 btn.setText("xxx")
    25 btn.setIcon(QIcon("icon.ico"))
    26 
    27 #展示控件
    28 window.show()
    29 
    30 #3,进入消息循环
    31 sys.exit(app.exec_())
    View Code
     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Window(QWidget):
     5     def contextMenuEvent(self, QContextMenuEvent):
     6 ############################菜单的设置###############################
     7         menu = QMenu(self)
     8 
     9         #菜单之行为动作 新建,打开
    10         new_action = QAction(menu)  # 父控件是menu
    11         new_action.setText("新建")
    12         new_action.setIcon(QIcon("icon.ico"))
    13         new_action.triggered.connect(lambda :print("新建文件"))
    14 
    15         open_action = QAction(menu)  # 父控件是menu
    16         open_action.setText("打开")
    17         open_action.setIcon(QIcon("icon.ico"))
    18         open_action.triggered.connect(lambda :print("打开文件"))
    19 
    20         exit_action = QAction(menu)  # 父控件是menu
    21         exit_action.setText("退出")
    22         exit_action.setIcon(QIcon("icon.ico"))
    23         exit_action.triggered.connect(lambda :print("退出"))
    24 
    25         menu.addAction(new_action)
    26         menu.addAction(open_action)
    27         menu.addAction(exit_action)
    28 
    29         menu.addSeparator()
    30         #菜单之子菜单   最近打开
    31 
    32         sub_menu = QMenu(menu)
    33         sub_menu.setTitle("最近打开 ")  # 注意不是steText
    34         sub_menu.setIcon(QIcon("icon.ico"))
    35 
    36         file_action = QAction("Python gui 编程 PyQt5")
    37         sub_menu.addAction(file_action)
    38 
    39 
    40         menu.addMenu(sub_menu)
    41         
    42  ############################菜单的设置###############################
    43         ###########################################################
    44         menu.exec_(QPoint(100,100))  #在 100 100 位置显示右键菜单
    45 
    46         ###########################################################
    47 
    48 
    49 #1,创建app
    50 app  = QApplication(sys.argv)
    51 
    52 
    53 #2,控件的操作:
    54 #创建控件
    55 window = Window()
    56 
    57 
    58 #设置控件
    59 window.setWindowTitle("QAbstactButton 有效区域")
    60 window.resize(500,500)
    61 
    62 
    63 btn = QPushButton(window)
    64 btn.setText("xxx")
    65 btn.setIcon(QIcon("icon.ico"))
    66 
    67 #展示控件
    68 window.show()
    69 
    70 #3,进入消息循环
    71 sys.exit(app.exec_())
    在100 100 位置显示右键菜单

    现在要让右键点在哪,显示在哪!

    那么鼠标点击的位置信息怎么找,它这个方法里会传过来这个参数。

    而且这个位置要是全局的!

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Window(QWidget):
     5     # def contextMenuEvent(self, QContextMenuEvent):
     6     def contextMenuEvent(self, event):
     7 ############################菜单的设置###############################
     8         menu = QMenu(self)
     9 
    10         #菜单之行为动作 新建,打开
    11         new_action = QAction(menu)  # 父控件是menu
    12         new_action.setText("新建")
    13         new_action.setIcon(QIcon("icon.ico"))
    14         new_action.triggered.connect(lambda :print("新建文件"))
    15 
    16         open_action = QAction(menu)  # 父控件是menu
    17         open_action.setText("打开")
    18         open_action.setIcon(QIcon("icon.ico"))
    19         open_action.triggered.connect(lambda :print("打开文件"))
    20 
    21         exit_action = QAction(menu)  # 父控件是menu
    22         exit_action.setText("退出")
    23         exit_action.setIcon(QIcon("icon.ico"))
    24         exit_action.triggered.connect(lambda :print("退出"))
    25 
    26         menu.addAction(new_action)
    27         menu.addAction(open_action)
    28         menu.addAction(exit_action)
    29 
    30         menu.addSeparator()
    31         #菜单之子菜单   最近打开
    32 
    33         sub_menu = QMenu(menu)
    34         sub_menu.setTitle("最近打开 ")  # 注意不是steText
    35         sub_menu.setIcon(QIcon("icon.ico"))
    36 
    37         file_action = QAction("Python gui 编程 PyQt5")
    38         sub_menu.addAction(file_action)
    39 
    40 
    41         menu.addMenu(sub_menu)
    42 
    43  ############################菜单的设置###############################
    44         ###########################################################
    45         # menu.exec_(QPoint(100,100))  #在 100 100 位置显示右键菜单
    46 
    47         menu.exec_(event.globalPos())  # 注意是全局的
    48         ###########################################################
    49 
    50 
    51 #1,创建app
    52 app  = QApplication(sys.argv)
    53 
    54 
    55 #2,控件的操作:
    56 #创建控件
    57 window = Window()
    58 
    59 
    60 #设置控件
    61 window.setWindowTitle("QAbstactButton 有效区域")
    62 window.resize(500,500)
    63 
    64 
    65 btn = QPushButton(window)
    66 btn.setText("xxx")
    67 btn.setIcon(QIcon("icon.ico"))
    68 
    69 #展示控件
    70 window.show()
    71 
    72 #3,进入消息循环
    73 sys.exit(app.exec_())
    View Code

    不过它这个方法是默认情况下的,

    如果我们通过setContextMenuPolicy() 给它设置为Qt.CustomContextMenu 的话,它就该变策略了,

    就不会再调用刚才的那个方法了(contextMenuEvent() )

    而是发射这样一个信号:

    customContextMenuRequested  了。

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Window(QWidget):
     5     # def contextMenuEvent(self, QContextMenuEvent):
     6     def contextMenuEvent(self, event):
     7         pass
     8 
     9 #1,创建app
    10 app  = QApplication(sys.argv)
    11 
    12 
    13 #2,控件的操作:
    14 #创建控件
    15 window = Window()
    16 
    17 
    18 #设置控件
    19 window.setWindowTitle("QAbstactButton 有效区域")
    20 window.resize(500,500)
    21 
    22 ############################通过setContextMenuPolicy 改变默认的值Qt.DefaultContextMenu###############################
    23 window.setContextMenuPolicy(Qt.CustomContextMenu)  # 这时就不会调用 contextMenuEvent了,
    24                                                         #而是发射customContextMenuRequested信号,
    25 
    26 def customContextMenuRequested_slot(point):  # point为鼠标点击的位置(局部的位置)
    27     print("右键菜单",point)
    28     menu = QMenu(window)
    29 
    30     #菜单之行为动作 新建,打开
    31     new_action = QAction(menu)  # 父控件是menu
    32     new_action.setText("新建")
    33     new_action.setIcon(QIcon("icon.ico"))
    34     new_action.triggered.connect(lambda :print("新建文件"))
    35 
    36     open_action = QAction(menu)  # 父控件是menu
    37     open_action.setText("打开")
    38     open_action.setIcon(QIcon("icon.ico"))
    39     open_action.triggered.connect(lambda :print("打开文件"))
    40 
    41     exit_action = QAction(menu)  # 父控件是menu
    42     exit_action.setText("退出")
    43     exit_action.setIcon(QIcon("icon.ico"))
    44     exit_action.triggered.connect(lambda :print("退出"))
    45 
    46     menu.addAction(new_action)
    47     menu.addAction(open_action)
    48     menu.addAction(exit_action)
    49 
    50     menu.addSeparator()
    51     #菜单之子菜单   最近打开
    52 
    53     sub_menu = QMenu(menu)
    54     sub_menu.setTitle("最近打开 ")  # 注意不是steText
    55     sub_menu.setIcon(QIcon("icon.ico"))
    56 
    57     file_action = QAction("Python gui 编程 PyQt5")
    58     sub_menu.addAction(file_action)
    59 
    60     menu.addMenu(sub_menu)
    61 
    62     menu.exec_(point)  # 此时的点是局部的
    63 
    64 
    65 
    66 window.customContextMenuRequested.connect(customContextMenuRequested_slot)
    67 
    68 
    69 ############################通过setContextMenuPolicy 改变默认的值Qt.DefaultContextMenu###############################
    70 
    71 
    72 btn = QPushButton(window)
    73 btn.setText("xxx")
    74 btn.setIcon(QIcon("icon.ico"))
    75 
    76 #展示控件
    77 window.show()
    78 
    79 #3,进入消息循环
    80 sys.exit(app.exec_())
    View Code

    此时,还不太性,因为这个信号携带的点是局部的,此时可以通过映射将其映射为全局的点!

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Window(QWidget):
     5     # def contextMenuEvent(self, QContextMenuEvent):
     6     def contextMenuEvent(self, event):
     7         pass
     8 
     9 #1,创建app
    10 app  = QApplication(sys.argv)
    11 
    12 
    13 #2,控件的操作:
    14 #创建控件
    15 window = Window()
    16 
    17 
    18 #设置控件
    19 window.setWindowTitle("QAbstactButton 有效区域")
    20 window.resize(500,500)
    21 
    22 
    23 
    24 window.setContextMenuPolicy(Qt.CustomContextMenu) 
    25 
    26 def customContextMenuRequested_slot(point):  # point为鼠标点击的位置(局部的位置)
    27     print("右键菜单",point)
    28     menu = QMenu(window)
    29 
    30     #菜单之行为动作 新建,打开
    31     new_action = QAction(menu)  # 父控件是menu
    32     new_action.setText("新建")
    33     new_action.setIcon(QIcon("icon.ico"))
    34     new_action.triggered.connect(lambda :print("新建文件"))
    35 
    36     open_action = QAction(menu)  # 父控件是menu
    37     open_action.setText("打开")
    38     open_action.setIcon(QIcon("icon.ico"))
    39     open_action.triggered.connect(lambda :print("打开文件"))
    40 
    41     exit_action = QAction(menu)  # 父控件是menu
    42     exit_action.setText("退出")
    43     exit_action.setIcon(QIcon("icon.ico"))
    44     exit_action.triggered.connect(lambda :print("退出"))
    45 
    46     menu.addAction(new_action)
    47     menu.addAction(open_action)
    48     menu.addAction(exit_action)
    49 
    50     menu.addSeparator()
    51     #菜单之子菜单   最近打开
    52 
    53     sub_menu = QMenu(menu)
    54     sub_menu.setTitle("最近打开 ")  # 注意不是steText
    55     sub_menu.setIcon(QIcon("icon.ico"))
    56 
    57     file_action = QAction("Python gui 编程 PyQt5")
    58     sub_menu.addAction(file_action)
    59 
    60     menu.addMenu(sub_menu)
    61 
    62     # menu.exec_(point)  # 此时的点是局部的
    63     
    64     ###########################################################
    65     global_point = window.mapToGlobal(point)
    66     menu.exec_(global_point)
    67     ###########################################################
    68     
    69 
    70 
    71 
    72 window.customContextMenuRequested.connect(customContextMenuRequested_slot)
    73 
    74 
    75 btn = QPushButton(window)
    76 btn.setText("xxx")
    77 btn.setIcon(QIcon("icon.ico"))
    78 
    79 #展示控件
    80 window.show()
    81 
    82 #3,进入消息循环
    83 sys.exit(app.exec_())
    将局部的点映射成全局的点

    其实所谓的映射转换,无非就是简单的计算而已,我们自己也可以做:

    如下:

     1 from PyQt5.Qt import * #刚开始学习可以这样一下导入
     2 import sys
     3 
     4 class Window(QWidget):
     5     # def contextMenuEvent(self, QContextMenuEvent):
     6     def contextMenuEvent(self, event):
     7         pass
     8 
     9 #1,创建app
    10 app  = QApplication(sys.argv)
    11 
    12 
    13 #2,控件的操作:
    14 #创建控件
    15 window = Window()
    16 
    17 
    18 #设置控件
    19 window.setWindowTitle("QAbstactButton 有效区域")
    20 window.resize(500,500)
    21 
    22 
    23 
    24 window.setContextMenuPolicy(Qt.CustomContextMenu)
    25 
    26 def customContextMenuRequested_slot(point):  # point为鼠标点击的位置(局部的位置)
    27     print("右键菜单",point)
    28     menu = QMenu(window)
    29 
    30     #菜单之行为动作 新建,打开
    31     new_action = QAction(menu)  # 父控件是menu
    32     new_action.setText("新建")
    33     new_action.setIcon(QIcon("icon.ico"))
    34     new_action.triggered.connect(lambda :print("新建文件"))
    35 
    36     open_action = QAction(menu)  # 父控件是menu
    37     open_action.setText("打开")
    38     open_action.setIcon(QIcon("icon.ico"))
    39     open_action.triggered.connect(lambda :print("打开文件"))
    40 
    41     exit_action = QAction(menu)  # 父控件是menu
    42     exit_action.setText("退出")
    43     exit_action.setIcon(QIcon("icon.ico"))
    44     exit_action.triggered.connect(lambda :print("退出"))
    45 
    46     menu.addAction(new_action)
    47     menu.addAction(open_action)
    48     menu.addAction(exit_action)
    49 
    50     menu.addSeparator()
    51     #菜单之子菜单   最近打开
    52 
    53     sub_menu = QMenu(menu)
    54     sub_menu.setTitle("最近打开 ")  # 注意不是steText
    55     sub_menu.setIcon(QIcon("icon.ico"))
    56 
    57     file_action = QAction("Python gui 编程 PyQt5")
    58     sub_menu.addAction(file_action)
    59 
    60     menu.addMenu(sub_menu)
    61 
    62     # menu.exec_(point)  # 此时的点是局部的
    63 
    64     ###########################################################
    65     # global_point = window.mapToGlobal(point)
    66 
    67     #手工计算
    68     global_x = point.x() + window.geometry().x()
    69     global_y = point.y() + window.geometry().y()
    70     menu.exec_(QPoint(global_x,global_y))
    71     ###########################################################
    72 
    73 
    74 
    75 
    76 window.customContextMenuRequested.connect(customContextMenuRequested_slot)
    77 
    78 
    79 btn = QPushButton(window)
    80 btn.setText("xxx")
    81 btn.setIcon(QIcon("icon.ico"))
    82 
    83 #展示控件
    84 window.show()
    85 
    86 #3,进入消息循环
    87 sys.exit(app.exec_())
    View Code

    总结:

    QPushButton 说完了,下面是他的子类

    QCommandLinkButton 命令链接按钮:https://www.cnblogs.com/zach0812/p/11367799.html

  • 相关阅读:
    HTTP常用的动词
    mysql5.7安装与主从复制
    Linq to XML 之XElement的Descendants方法的新发现
    SQL中的内连接外连接和交叉连接是什么意思?
    LINQ TO SQL ——Group by
    分布式Web服务器架构
    基于socket的客户端和服务端聊天机器人
    linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
    关于301、302、303重定向的那些事
    手写async await的最简实现
  • 原文地址:https://www.cnblogs.com/zach0812/p/11366769.html
Copyright © 2020-2023  润新知