前言:
說完了擁有按鈕共性的抽象類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 功能作用之菜單:
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_())
二:在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_())
三: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_())
需要注意的是,如果之前有設置背景顏色的話,如果我們后面又設置了扁平化的話,那么背景顏色就不再繪制了。

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_())
三: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_())

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_())
它的應用場景主要在對話框中,當我們打開一個對話框之后,可以設置默認處理的按鈕。
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_())

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_())
現在要讓右鍵點在哪,顯示在哪!
那么鼠標點擊的位置信息怎么找,它這個方法里會傳過來這個參數。
而且這個位置要是全局的!

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_())
不過它這個方法是默認情況下的,
如果我們通過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_())
此時,還不太性,因為這個信號攜帶的點是局部的,此時可以通過映射將其映射為全局的點!

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_())
總結:
QPushButton 說完了,下面是他的子類
QCommandLinkButton 命令鏈接按鈕:https://www.cnblogs.com/zach0812/p/11367799.html