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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM