Python PyQt5 QRadioButton 單選框用法與範例

本篇 ShengYu 介紹 Python PyQt5 QRadioButton 單選框用法與範例,QRadioButton 可以作一些多選項擇一的選取功能,例如性別選取、葷素食選取等等。

以下的 Python PyQt5 QRadioButton 用法與範例將分為這幾部分,

  • PyQt5 QRadioButton 基本用法
  • PyQt5 QRadioButton 多組選取
  • PyQt5 設定 QRadioButton 預設的選項
  • PyQt5 QRadioButton 綁定事件

那我們開始吧!

PyQt5 QRadioButton 基本用法

這邊介紹 PyQt5 建立 QRadioButton 的基本用法,QRadioButton 基本上也是個按鈕,在建構 QRadioButton 時帶入顯示的文字,多個 QRadioButton 在同一個父類視窗下是互斥的,也就是在同一個父類視窗下的多個 QRadioButton 只能一個選取一個,如果選取另一個 QRadioButton 的話,先前選取的 QRadioButton 則會被取消,QRadioButton 搭配 QButtonGroup 使用的話則可以實做出多群組 QRadioButton 的互斥選取,稍後會介紹到。

以下示範將三個 QRadioButton 放入同一個父類裡,

python-pyqt-qradiobutton.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout,
QRadioButton)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QVBoxLayout()
self.setLayout(layout)

self.myradiobutton1 = QRadioButton('apple', self)
layout.addWidget(self.myradiobutton1)
self.myradiobutton2 = QRadioButton('banana', self)
layout.addWidget(self.myradiobutton2)
self.myradiobutton3 = QRadioButton('orange', self)
layout.addWidget(self.myradiobutton3)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,所以實際操作時可以發現同一群裡的 QRadioButton 單選框是互斥的,只能選擇其中一個 QRadioButton,

那如果想要產生 QRadioButton 多組選取呢?在下節範例馬上為你介紹。

PyQt5 QRadioButton 多組選取

PyQt5 如果想要產生 QRadioButton 多組選取要怎麼實作呢?

這時候可以使用 QButtonGroup,這邊示範兩群組 QRadioButton 選取,將二個群組的 QRadioButton 各放入二個 QButtonGroup,這邊我們建立二個 QButtonGroup,把 myradiobutton1 ~ myradiobutton3 放入第一個 QButtonGroup,把 myradiobutton4 ~ myradiobutton6 放入第二個 QButtonGroup,同時也把 layout 改成 QGridLayout,左邊為第一群,右邊為第二群,方便示範說明,

python-pyqt-qradiobutton2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,
QRadioButton, QButtonGroup)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QGridLayout()
self.setLayout(layout)

self.myradiobutton1 = QRadioButton('apple', self)
layout.addWidget(self.myradiobutton1, 0, 0)
self.myradiobutton2 = QRadioButton('banana', self)
layout.addWidget(self.myradiobutton2, 1, 0)
self.myradiobutton3 = QRadioButton('orange', self)
layout.addWidget(self.myradiobutton3, 2, 0)
self.myradiobutton4 = QRadioButton('lemon', self)
layout.addWidget(self.myradiobutton4, 0, 1)
self.myradiobutton5 = QRadioButton('strawberry', self)
layout.addWidget(self.myradiobutton5, 1, 1)
self.myradiobutton6 = QRadioButton('tomato', self)
layout.addWidget(self.myradiobutton6, 2, 1)

self.buttongroup = QButtonGroup(self)
self.buttongroup.addButton(self.myradiobutton1, 1)
self.buttongroup.addButton(self.myradiobutton2, 2)
self.buttongroup.addButton(self.myradiobutton3, 3)

self.buttongroup2 = QButtonGroup(self)
self.buttongroup2.addButton(self.myradiobutton4, 4)
self.buttongroup2.addButton(self.myradiobutton5, 5)
self.buttongroup2.addButton(self.myradiobutton6, 6)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 設定 QRadioButton 預設的選項

這邊介紹 PyQt5 設定 QCheckBox 預設的選項,建立 QCheckBox 後預設是不勾選的狀態,有兩種方式可以改變這個狀態,
一個是使用 QCheckBox.toggle(),toggle 就是原本勾選的會變成不勾選,在使用一次 toggle 的話原本不勾選的會變成勾選,
另一個方式是透過 QCheckBox.setChecked() 來設定 CheckBox 是否要勾選,True 為 勾選,False 為不勾選,

python-pyqt-qradiobutton3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,
QRadioButton, QButtonGroup)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QGridLayout()
self.setLayout(layout)

self.myradiobutton1 = QRadioButton('apple', self)
layout.addWidget(self.myradiobutton1, 0, 0)
self.myradiobutton2 = QRadioButton('banana', self)
layout.addWidget(self.myradiobutton2, 1, 0)
self.myradiobutton3 = QRadioButton('orange', self)
layout.addWidget(self.myradiobutton3, 2, 0)
self.myradiobutton4 = QRadioButton('lemon', self)
layout.addWidget(self.myradiobutton4, 0, 1)
self.myradiobutton5 = QRadioButton('strawberry', self)
layout.addWidget(self.myradiobutton5, 1, 1)
self.myradiobutton6 = QRadioButton('tomato', self)
layout.addWidget(self.myradiobutton6, 2, 1)

self.buttongroup = QButtonGroup(self)
self.buttongroup.addButton(self.myradiobutton1, 1)
self.buttongroup.addButton(self.myradiobutton2, 2)
self.buttongroup.addButton(self.myradiobutton3, 3)

self.buttongroup2 = QButtonGroup(self)
self.buttongroup2.addButton(self.myradiobutton4, 4)
self.buttongroup2.addButton(self.myradiobutton5, 5)
self.buttongroup2.addButton(self.myradiobutton6, 6)

self.myradiobutton1.toggle()
self.myradiobutton4.setChecked(True)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 QRadioButton 綁定事件

這邊介紹 PyQt5 QRadioButton 如何綁定事件,透過先前的範例我們將 QRadioButton 加入 QButtonGroup 後,所以這邊我們是要將 QButtonGroup 的 buttonClicked 事件連接到我們要處理的函式,第一群連結至 onButtonGroup1Click(),第二群連結至 onButtonGroup2Click(),範例如下,

python-pyqt-qradiobutton4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,
QRadioButton, QButtonGroup, QPushButton)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QGridLayout()
self.setLayout(layout)

self.myradiobutton1 = QRadioButton('apple', self)
layout.addWidget(self.myradiobutton1, 0, 0)
self.myradiobutton2 = QRadioButton('banana', self)
layout.addWidget(self.myradiobutton2, 1, 0)
self.myradiobutton3 = QRadioButton('orange', self)
layout.addWidget(self.myradiobutton3, 2, 0)
self.myradiobutton4 = QRadioButton('lemon', self)
layout.addWidget(self.myradiobutton4, 0, 1)
self.myradiobutton5 = QRadioButton('strawberry', self)
layout.addWidget(self.myradiobutton5, 1, 1)
self.myradiobutton6 = QRadioButton('tomato', self)
layout.addWidget(self.myradiobutton6, 2, 1)

self.mybutton = QPushButton('button', self)
layout.addWidget(self.mybutton, 3, 1)

self.buttongroup1 = QButtonGroup(self)
self.buttongroup1.addButton(self.myradiobutton1, 1)
self.buttongroup1.addButton(self.myradiobutton2, 2)
self.buttongroup1.addButton(self.myradiobutton3, 3)

self.buttongroup2 = QButtonGroup(self)
self.buttongroup2.addButton(self.myradiobutton4, 4)
self.buttongroup2.addButton(self.myradiobutton5, 5)
self.buttongroup2.addButton(self.myradiobutton6, 6)

self.buttongroup1.buttonClicked.connect(self.onButtonGroup1Click)
self.buttongroup2.buttonClicked.connect(self.onButtonGroup2Click)
self.mybutton.clicked.connect(self.onButtonClick)

self.myradiobutton1.setChecked(True)
self.myradiobutton4.setChecked(True)
self.fruit1 = self.myradiobutton1.text()
self.fruit2 = self.myradiobutton4.text()

def onButtonGroup1Click(self):
if self.buttongroup1.checkedId() == 1:
print('1 checked')
self.fruit1 = self.myradiobutton1.text()
elif self.buttongroup1.checkedId() == 2:
print('2 checked')
self.fruit1 = self.myradiobutton2.text()
elif self.buttongroup1.checkedId() == 3:
print('3 checked')
self.fruit1 = self.myradiobutton3.text()
else:
print('? checked')

def onButtonGroup2Click(self):
if self.buttongroup2.checkedId() == 4:
print('4 checked')
self.fruit2 = self.myradiobutton4.text()
elif self.buttongroup2.checkedId() == 5:
print('5 checked')
self.fruit2 = self.myradiobutton5.text()
elif self.buttongroup2.checkedId() == 6:
print('6 checked')
self.fruit2 = self.myradiobutton6.text()
else:
print('? checked')

def onButtonClick(self):
print(self.fruit1 + ' + ' + self.fruit2)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

1
2
3
2 checked
6 checked
banana + tomato

也可以將兩個 QButtonGroup 的 buttonClicked 事件都連結到 onButtonGroupClick() 同一個函式處理,在 onButtonGroupClick() 裡使用 self.sender() 來判斷是哪一個 QButtonGroup,

python-pyqt-qradiobutton5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,
QRadioButton, QButtonGroup, QPushButton)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QGridLayout()
self.setLayout(layout)

self.myradiobutton1 = QRadioButton('apple', self)
layout.addWidget(self.myradiobutton1, 0, 0)
self.myradiobutton2 = QRadioButton('banana', self)
layout.addWidget(self.myradiobutton2, 1, 0)
self.myradiobutton3 = QRadioButton('orange', self)
layout.addWidget(self.myradiobutton3, 2, 0)
self.myradiobutton4 = QRadioButton('lemon', self)
layout.addWidget(self.myradiobutton4, 0, 1)
self.myradiobutton5 = QRadioButton('strawberry', self)
layout.addWidget(self.myradiobutton5, 1, 1)
self.myradiobutton6 = QRadioButton('tomato', self)
layout.addWidget(self.myradiobutton6, 2, 1)

self.mybutton = QPushButton('button', self)
layout.addWidget(self.mybutton, 3, 1)

self.buttongroup1 = QButtonGroup(self)
self.buttongroup1.addButton(self.myradiobutton1, 1)
self.buttongroup1.addButton(self.myradiobutton2, 2)
self.buttongroup1.addButton(self.myradiobutton3, 3)

self.buttongroup2 = QButtonGroup(self)
self.buttongroup2.addButton(self.myradiobutton4, 4)
self.buttongroup2.addButton(self.myradiobutton5, 5)
self.buttongroup2.addButton(self.myradiobutton6, 6)

self.buttongroup1.buttonClicked.connect(self.onButtonGroupClick)
self.buttongroup2.buttonClicked.connect(self.onButtonGroupClick)
self.mybutton.clicked.connect(self.onButtonClick)

self.myradiobutton1.setChecked(True)
self.myradiobutton4.setChecked(True)
self.fruit1 = self.myradiobutton1.text()
self.fruit2 = self.myradiobutton4.text()

def onButtonGroupClick(self):
sender = self.sender()
if sender == self.buttongroup1:
if self.buttongroup1.checkedId() == 1:
print('1 checked')
self.fruit1 = self.myradiobutton1.text()
elif self.buttongroup1.checkedId() == 2:
print('2 checked')
self.fruit1 = self.myradiobutton2.text()
elif self.buttongroup1.checkedId() == 3:
print('3 checked')
self.fruit1 = self.myradiobutton3.text()
else:
print('? checked')
else:
if self.buttongroup2.checkedId() == 4:
print('4 checked')
self.fruit2 = self.myradiobutton4.text()
elif self.buttongroup2.checkedId() == 5:
print('5 checked')
self.fruit2 = self.myradiobutton5.text()
elif self.buttongroup2.checkedId() == 6:
print('6 checked')
self.fruit2 = self.myradiobutton6.text()
else:
print('? checked')

def onButtonClick(self):
print(self.fruit1 + ' + ' + self.fruit2)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

以上就是 Python PyQt5 QRadioButton 單選框用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
下一篇將會介紹 PyQt5 QCheckBox 複選框用法與範例

其它相關文章推薦
Python 新手入門教學懶人包
Python PyQt5 新手入門教學

Python PyQt5 QPixmap 用法與範例

本篇 ShengYu 介紹 Python PyQt5 QPixmap 用法與範例,QPixmap 是專門處理繪圖的類別,顯示影像到螢幕裝置上,在這篇我們將會介紹如何使用 QPixmap 來讀取圖片並顯示出來。

以下的 Python PyQt5 QPixmap 用法與範例將分為這幾部分,

  • PyQt5 QPixmap 讀取圖片並顯示在 QLabel 上
  • PyQt5 用按鈕來觸發 QPixmap 讀取圖片顯示在 QLabel 上
  • PyQt5 QPixmap 用檔案對話框開啟圖片並顯示在 QLabel 上

PyQt5 QPixmap 讀取圖片並顯示在 QLabel 上

QPixmap 跟之前介紹的 Widget 不一樣,之前都是使用 QtWidgets 裡的元件,而 QPixmap 則是 QtGui 裡專門處理繪圖的類別,實際上要使用 QPixmap 時要配合著 QLabel 或者 QAbstractButton 的延伸類別(例如QPushButton)一起使用,

QPixmap 支援的影像格式有:BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM 和 XPM。

QImage 是為 I/O 或圖片 pixel 像素存取而設計的。如果你想要存取圖片的像素或是修改圖片像素,則需要使用 QImage,

這邊示範 PyQt5 QPixmap 基本用法,這邊先示範一個 label 搭配 QPixmap 使用,self.mypixmap = QPixmap('lena.jpg') 建構 QPixmap 同時傳入圖片檔名讀取圖片,接著再用 QLabel.setPixmap() 將該 QPixmap 設定給 mylabel,如果目錄下沒有 lena.jpg 這張圖片的話則會顯示空白的 label,範例如下,

python-pyqt-qpixmap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QLabel)
from PyQt5.QtGui import QPixmap

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QVBoxLayout()
self.setLayout(layout)

self.mylabel = QLabel('this is an image', self)
layout.addWidget(self.mylabel)

self.mypixmap = QPixmap('lena.jpg')
self.mylabel.setPixmap(self.mypixmap)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 用按鈕來觸發 QPixmap 讀取圖片顯示在 QLabel 上

這邊介紹 PyQt5 用按鈕事件來讓 QPixmap 讀取圖片,

QPixmap 讀取圖片的方法不只一種,除了可以使用 self.mypixmap = QPixmap('lena.jpg') 建構 QPixmap 的同時順便讀取圖片外,也可以先建構 QPixmap() 再用 QPixmap.load() 讀取圖片,

要判斷有沒有讀取圖片成功的話可以使用 QPixmap.isNull() 來進行判斷,

python-pyqt-qpixmap2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, QLabel, QPushButton)
from PyQt5.QtGui import QPixmap

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QGridLayout()
self.setLayout(layout)

self.mylabel = QLabel('click button to load image', self)
layout.addWidget(self.mylabel, 0, 0, 1, 2)

self.mybutton1 = QPushButton('load image', self)
self.mybutton1.clicked.connect(self.loadImageAndShow)
layout.addWidget(self.mybutton1, 1, 0)

def loadImageAndShow(self):
print('load image...')
# self.mypixmap = QPixmap('lena.jpg')
# or
self.mypixmap = QPixmap()
self.mypixmap.load('lena.jpg')
if self.mypixmap.isNull():
print('load image failed')
return
self.mylabel.setPixmap(self.mypixmap)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 QPixmap 用檔案對話框開啟圖片並顯示在 QLabel 上

這邊示範 QPixmap 用檔案對話框開啟圖片並顯示在 QLabel 上,在 QFileDialog.getOpenFileName() 裡指定 png、jpg、jpeg 或 bmp 檔案類型,QFileDialog.getOpenFileName() 詳細的檔案對話框細節請參考這篇,接著將取得的 filename 判斷是不是為空,否則的話就進行建構 QPixmap 與讀取圖片檔,之後顯示在 label 上,

python-pyqt-qpixmap3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,
QLabel, QPushButton, QFileDialog)
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QCoreApplication

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QGridLayout()
self.setLayout(layout)

self.mylabel = QLabel('click button to open image', self)
layout.addWidget(self.mylabel, 0, 0, 1, 2)

self.mybutton1 = QPushButton('open image', self)
self.mybutton1.clicked.connect(self.openImageAndShow)
layout.addWidget(self.mybutton1, 1, 0)

self.mybutton2 = QPushButton('exit', self)
self.mybutton2.clicked.connect(QCoreApplication.instance().quit)
layout.addWidget(self.mybutton2, 1, 1)

def openImageAndShow(self):
print('QFileDialog.getOpenFileName')
filename, _ = QFileDialog.getOpenFileName(
self,
filter='Image Files (*.png *.jpg *.jpeg *.bmp)')

if not filename:
print('filename is empty')
return

print('load image...')
self.mypixmap = QPixmap(filename)
if self.mypixmap.isNull():
print('load image failed')
return
self.mylabel.setPixmap(self.mypixmap)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

以上就是 Python PyQt5 QPixmap 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它參考
QPixmap Class | Qt GUI 5
https://doc.qt.io/qt-5/qpixmap.html

其它相關文章推薦
Python 新手入門教學懶人包
Python PyQt5 新手入門教學

Python PyQt5 QTimer 定時器用法與範例

本篇 ShengYu 介紹 Python PyQt5 QTimer 定時器用法與範例,QTimer 定時器可以作間隔一段時間就要執行任務的相關應用,例如時鐘、更新攝影機顯示影像或倒數計時器等等應用。

以下的 Python PyQt5 QTimer 用法與範例將分為這幾部分,

  • PyQt5 QTimer 基本用法與綁定事件
  • PyQt5 用按鈕事件啟動 QTimer 定時器
  • PyQt5 QTimer 倒數計時器

PyQt5 QTimer 基本用法與綁定事件

這邊示範 PyQt5 QTimer 基本用法,這邊先示範一個定時器搭配一個 label,每間隔 1 秒就更新秒數在 label 上,

QTimer 綁定事件可以用 QTimer.timeout.connect() 這個信號,將信號綁訂到對應處理的函式,如下例中的 onTimer(),當時間到時會執行 onTimer()

要啟動 QTimer 定時器的話要使用 QTimer.start(),引數是帶入時間間隔,單位為 ms 毫秒,例如帶入 1000 表示每隔 1000ms 毫秒會觸發 onTimer() 一次,因此不僅僅只是觸發一次而已。需要停止 QTimer 可以使用 QTimer.stop() ,在下一個範例會介紹到,

python-pyqt-qtimer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel)
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QTimer

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mylabel = QLabel('timer', self)
self.mylabel.setFont(QFont('Arial', 24))
self.mylabel.move(60, 50)

self.counter = 0

self.mytimer = QTimer(self)
self.mytimer.timeout.connect(self.onTimer)
self.mytimer.start(1000)

def onTimer(self):
self.counter += 1
self.mylabel.setText(str(self.counter))

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 用按鈕事件啟動 QTimer 定時器

這邊介紹 PyQt5 用按鈕事件啟動 QTimer 定時器,利用一個按鈕啟動 QTimer 定時器,另一個按鈕來停止 QTimer 定時器。

將 mybutton1 的按下事件綁定 startTimer() 函式,startTimer() 會使用 QTimer.start() 去啟動 timer 跟其它相關的設定,接著將 mybutton2 的按下事件綁定 stopTimer() 函式,stopTimer() 會使用 QTimer.stop() 去停止 timer。

這邊的 mybutton1 與 mybutton2 按鈕還加上了防呆設計,當 mybutton1 按下時,mybutton1 就必須 disable,避免使用者重複按下,而 mybutton2 要 enable,而按下 mybutton2 時則反之,

python-pyqt-qtimer2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, QLabel, QPushButton)
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QTimer

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

gridlayout = QGridLayout()
self.setLayout(gridlayout)

self.mylabel = QLabel('timer', self)
self.mylabel.setFont(QFont('Arial', 24))
gridlayout.addWidget(self.mylabel, 0, 0, 1, 2)

self.mybutton1 = QPushButton('start', self)
self.mybutton1.clicked.connect(self.startTimer)
gridlayout.addWidget(self.mybutton1, 1, 0)

self.mybutton2 = QPushButton('stop', self)
self.mybutton2.clicked.connect(self.stopTimer)
self.mybutton2.setDisabled(True)
gridlayout.addWidget(self.mybutton2, 1, 1)

self.mytimer = QTimer(self)
self.mytimer.timeout.connect(self.onTimer)

def startTimer(self):
self.counter = 0
self.mylabel.setText('start timer...')
self.mybutton1.setDisabled(True)
self.mybutton2.setDisabled(False)
self.mytimer.start(1000)

def stopTimer(self):
self.mylabel.setText('stop timer')
self.mybutton1.setDisabled(False)
self.mybutton2.setDisabled(True)
self.mytimer.stop()

def onTimer(self):
self.counter += 1
self.mylabel.setText(str(self.counter))

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,這邊是使用 QGridLayout 來進行 UI 元件排版,更多的 QGridLayout 介紹可以參考Python PyQt5 QGridLayout 網格佈局用法與範例這篇,

以上的範例也可以把兩個按鈕精簡成一個按鈕,第一次按下按鈕時啟動定時器,再次按下按鈕就停止計時器,這邊就先簡單介紹不作示範了。

PyQt5 QTimer 倒數計時器

QTimer 除了作定時器以外,你也可以利用 QTimer 來實作倒數計時器,倒數完後停止定時器後去執行你想要的函式或程式邏輯,以下示範倒數 5 秒後執行一行 print()

python-pyqt-qtimer3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel)
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QTimer

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.counter = 5
self.mylabel = QLabel(str(self.counter), self)
self.mylabel.setFont(QFont('Arial', 24))
self.mylabel.move(60, 50)

self.mytimer = QTimer(self)
self.mytimer.timeout.connect(self.onTimer)
self.mytimer.start(1000)

def onTimer(self):
self.counter -= 1
self.mylabel.setText(str(self.counter))
if self.counter == 0:
self.mytimer.stop()
print('time out')

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

以上就是 Python PyQt5 QTimer 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Python 新手入門教學懶人包
Python PyQt5 新手入門教學

Python PyQt5 QCheckBox 複選框用法與範例

本篇 ShengYu 將介紹 Python PyQt5 QCheckBox 複選框用法與範例,CheckBox 可以作一些多選項的確認功能,例如代辦清單這種應用。

以下的 Python PyQt5 QCheckBox 用法與範例將分為這幾部分,

  • PyQt5 QCheckBox 基本用法
  • PyQt5 設定 QCheckBox 預設的選項
  • PyQt5 QCheckBox 綁定事件

PyQt5 QCheckBox 基本用法

PyQt5 簡單建立 QCheckBox 的用法如下,在建構 QCheckBox 的同時帶入複選框的顯示文字,之後使用 move 移動到想要顯示的座標上,

python-pyqt-qcheckbox.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QCheckBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.checkbox = QCheckBox('PyQt5', self)
self.checkbox.move(60, 50)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

這邊示範建立多個 QCheckBox,並且不使用 move 手動排版的方式,而是透過放入 QVBoxLayout 來進行排版,

python-pyqt-qcheckbox2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QCheckBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QVBoxLayout()
self.setLayout(layout)

self.checkbox1 = QCheckBox('apple', self)
layout.addWidget(self.checkbox1)

self.checkbox2 = QCheckBox('banana', self)
layout.addWidget(self.checkbox2)

self.checkbox3 = QCheckBox('orange', self)
layout.addWidget(self.checkbox3)

self.checkbox4 = QCheckBox('tomato', self)
layout.addWidget(self.checkbox4)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 設定 QCheckBox 預設的選項

這邊介紹 PyQt5 設定 QCheckBox 預設的選項,建立 QCheckBox 後預設是不勾選的狀態,有兩種方式可以改變這個狀態,
一個是使用 QCheckBox.toggle(),toggle 就是原本勾選的會變成不勾選,在使用一次 toggle 的話原本不勾選的會變成勾選,
另一個方式是透過 QCheckBox.setChecked() 來設定 CheckBox 是否要勾選,True 為 勾選,False 為不勾選,

python-pyqt-qcheckbox3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QCheckBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QVBoxLayout()
self.setLayout(layout)

self.checkbox1 = QCheckBox('apple', self)
layout.addWidget(self.checkbox1)

self.checkbox2 = QCheckBox('banana', self)
self.checkbox2.toggle()
layout.addWidget(self.checkbox2)

self.checkbox3 = QCheckBox('orange', self)
self.checkbox3.setChecked(False)
layout.addWidget(self.checkbox3)

self.checkbox4 = QCheckBox('tomato', self)
self.checkbox4.setChecked(True)
layout.addWidget(self.checkbox4)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 QCheckBox 綁定事件

PyQt5 QCheckBox 綁定事件可以用 QCheckBox.clicked.connect(),或者是 QCheckBox.stateChanged.connect() 這兩種信號,將信號綁訂到對應處理的函式,這邊示範 QCheckBox.clicked.connect() 信號綁訂,

而在處理函式裡可以使用 QCheckBox.isChecked() 來判斷該 CheckBox 是否被 check 了,

python-pyqt-qcheckbox4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QCheckBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QVBoxLayout()
self.setLayout(layout)

self.checkbox1 = QCheckBox('apple', self)
self.checkbox1.clicked.connect(self.onCheckBox1Click)
layout.addWidget(self.checkbox1)

self.checkbox2 = QCheckBox('banana', self)
self.checkbox2.clicked.connect(self.onCheckBox2Click)
layout.addWidget(self.checkbox2)

self.checkbox3 = QCheckBox('orange', self)
self.checkbox3.clicked.connect(self.onCheckBox3Click)
layout.addWidget(self.checkbox3)

self.checkbox4 = QCheckBox('tomato', self)
self.checkbox4.clicked.connect(self.onCheckBox4Click)
layout.addWidget(self.checkbox4)

def onCheckBox1Click(self):
if self.checkbox1.isChecked():
print('apple is checked')
else:
print('apple is unchecked')

def onCheckBox2Click(self):
if self.checkbox2.isChecked():
print('banana is checked')
else:
print('banana is unchecked')

def onCheckBox3Click(self):
if self.checkbox3.isChecked():
print('orange is checked')
else:
print('orange is unchecked')

def onCheckBox4Click(self):
if self.checkbox4.isChecked():
print('tomato is checked')
else:
print('tomato is unchecked')

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

當然你也可以這幾個 CheckBox 全部綁訂同一個事件處理函式,而在 onCheckBoxClick() 處理函式裡透過 self.sender() 的方式可以取得是哪一個 CheckBox,範例如下,

python-pyqt-qcheckbox5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QCheckBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

layout = QVBoxLayout()
self.setLayout(layout)

self.checkbox1 = QCheckBox('apple', self)
self.checkbox1.clicked.connect(self.onCheckBoxClick)
layout.addWidget(self.checkbox1)

self.checkbox2 = QCheckBox('banana', self)
self.checkbox2.clicked.connect(self.onCheckBoxClick)
layout.addWidget(self.checkbox2)

self.checkbox3 = QCheckBox('orange', self)
self.checkbox3.clicked.connect(self.onCheckBoxClick)
layout.addWidget(self.checkbox3)

self.checkbox4 = QCheckBox('tomato', self)
self.checkbox4.clicked.connect(self.onCheckBoxClick)
layout.addWidget(self.checkbox4)

def onCheckBoxClick(self):
checkbox = self.sender()
#print(checkbox)
if checkbox.isChecked():
print(checkbox.text() + ' is checked')
else:
print(checkbox.text() + ' is unchecked')

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

以上就是 Python PyQt5 QCheckBox 複選框用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Python 新手入門教學懶人包
Python PyQt5 新手入門教學

Python PyQt5 QFileDialog 開啟檔案對話框

本篇介紹如何在 Python PyQt5 中開啟檔案對話框,開啟檔案對話框是要讓使用者可以自己選取要開啟的檔案,在 PyQt5 裡要開啟檔案對話框可以使用 QFileDialog,

Python PyQt5 QFileDialog 開啟檔案對話框

Python PyQt5 要叫出開啟檔案對話框要使用 QFileDialog.getOpenFileName(),如果沒有父類視窗 Widget 的話,QFileDialog.getOpenFileName() 第一個引數 Widget 帶入可以使用 None,

python-pyqt-qfiledialog-1.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QFileDialog)

if __name__ == '__main__':
app = QApplication(sys.argv)
filename, filetype = QFileDialog.getOpenFileName(None)
if filename:
print(filename)
print(filetype)

QFileDialog.getOpenFileName() 如果有父類視窗 Widget 的話可以這樣寫,完整的 python 3 使用範例如下,

python-pyqt-qfiledialog-2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, filetype = QFileDialog.getOpenFileName(self)
if filename:
print(filename)
print(filetype)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

接著就把程式執行起來看看吧!程式啟動後會彈出一個開啟檔案的對話框,如下圖所示,

接著選好檔案後,按下OK確定按鈕後 getOpenFileName() 就會回傳檔案路徑與檔案類型了。

PyQt5 QFileDialog 判斷開啟檔案對話框回傳的檔案

通常程式會需要去判斷使用者是否選擇了一個合法的檔案或者是取消動作根本沒選檔案,
這邊示範最簡單的方法是接著判斷檔案是否為空,不為空的話才繼續做接下來的程式邏輯,
QFileDialog.getOpenFileName() 會回傳的兩個 str,若取消的話會回傳兩個空的 str,
判斷 str 不為 empty 的寫法可以用 not 運算子,之前在這篇有介紹過, 這邊我們沒有使用到回傳的 filetype,所以用 _ 不取得這個回傳值,

實際上程式會寫成這樣,

python-pyqt-qfiledialog-3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, _ = QFileDialog.getOpenFileName(self)
if not filename:
print('filename is empty')
else:
with open(filename, 'r') as f:
print(f.read())

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

PyQt5 QFileDialog 設定開啟檔案對話框的標題

QFileDialog 想要設定一些提示訊息在開啟檔案對話框的標題,來提示使用者到底要開什麼檔案的話,
可以在 QFileDialog.getOpenFileName() 的第二個引數裡指定顯示的標題,

實際上就會寫成這樣,

python-pyqt-qfiledialog-4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案')
if filename:
print(filename)
print(filetype)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

也可以用指定 caption 的方式,

1
filename, filetype = QFileDialog.getOpenFileName(self, caption='開啟檔案')

PyQt5 QFileDialog 指定一個初始的目錄來開啟檔案

QFileDialog 通常會有個初始的目錄讓使用者去選,但預設的目錄可能離最終目標的目錄差很多層,這樣使用者要點很多次,很不方便,所以會給一個初始目錄,這邊示範用 os.getcwd() 取得當前目錄,

python-pyqt-qfiledialog-5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', os.getcwd())
if filename:
print(filename)
print(filetype)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

設定成家目錄的話可以使用 os.path.expanduser('~') 的方式,這方法 Windows 與 Linux 都適用,

1
2
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', 
os.path.expanduser('~'))

你也可以設定一個絕對路徑,這邊示範 /tmp/ 路徑,

1
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', '/tmp/')

也可以用指定參數的寫法,像這樣寫,

1
2
filename, filetype = QFileDialog.getOpenFileName(self, caption='開啟檔案',
directory='C:/')

PyQt5 QFileDialog 設定開啟的檔案類型

假設使用者只想開啟圖片類型的檔案,又不想看到一堆非圖片類型的檔案例如像 .txt 或其他類型,
否則使用者在選擇檔案時會找很慢,所以有些情況下會去設定開啟的檔案類型,這有助於加速使用者開啟檔案,
可以在 QFileDialog.getOpenFileName() 第四個引數裡指定要開啟的檔案類型,範例如下,

python-pyqt-qfiledialog-6.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QFileDialog)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mybutton = QPushButton('button', self)
self.mybutton.move(60, 50)
self.mybutton.clicked.connect(self.onButtonClick)

def onButtonClick(self):
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', os.getcwd(),
'All Files (*);;JPEG Files (*.jpg)')
if filename:
print(filename)
print(filetype)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

如果想開啟文字檔類型的話,可以這樣寫,

1
2
filename, filetype = QFileDialog.getOpenFileName(self, '開啟檔案', os.getcwd(),
'All Files (*);;Text Files (*.txt)')

以上就是 Python PyQt5 QFileDialog 開啟檔案對話框用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦

Python 新手入門教學懶人包
Python PyQt5 新手入門教學

Python 求最大值的 3 個方法

本篇 ShengYu 介紹 Python 求最大值的 3 個方法,Python 求最大值可使用內建 max 函式,Python max 函式可以求兩數最大值以外,Python max 函式也可以拿來計算 list 多組數字的最大值,最後也會順便介紹 Python numpy 的 argmax 函式來求最大值,

以下的 Python 求最大值的 3 個方法將分為這幾種,

  • Python 兩數求最大值的方法
  • Python list 求最大值的方法
  • Python numpy 求最大值的方法

Python 兩數求最大值的方法

以下為 Python 兩數中求最大值的方法,要自己寫一個 max 函式也不是不行,只是如果想快速開發的話,使用 Python 內建提供的 max() 函式會方便快速些,

python3-max-1.py
1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print(max(4, 6))
print(max(11, 7))
print(max(16.6, 18.1))

Python max 輸出結果如下,

1
2
3
6
11
18.1

Python list 求最大值的方法

這邊介紹 Python list 求最大值的方法,同時耶適用於三數求最大值,或者更多組數字以上求最大值,
python 內建提供的 max() 函式可以支援 list 作為輸入,所以這邊很快速地沿用上個範例的經驗,直接將 python 內建 max() 函式拿來用,

python3-max-2.py
1
2
3
4
5
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

mylist = [5,3,-5,6,2,4]
print(max(mylist))

Python max 輸出結果如下,

1
6

或者是自己用 for 迴圈自己寫一個求最大值的函式,

python3-max-3.py
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

mylist = [5,3,-5,6,2,4]
max_val = mylist[0]
for i in range(len(mylist)):
if mylist[i] > max_val:
max_val = mylist[i]
print(max_val)

輸出結果同上,

Python numpy 求最大值的方法

這邊介紹 Python numpy 求最大值的方法,numpy 有個 numpy.argmax() 函式可以求最大值的索引值,所以要得到最大值的話就可以藉由最大值的索引值去取得,如下範例程式,

python3-max-4.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np

arr = np.array([5,3,-5,6,2,4])
print(arr)

max_index = np.argmax(arr)
print(max_index)

max_value = arr[max_index]
print(max_value)

numpy argmax 輸出結果如下,

1
2
3
[ 5  3 -5  6  2  4]
3
6

以上就是 Python 求最大值的 3 個方法的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Python 新手入門教學懶人包

Python 2 種取得當前路徑的方法

本篇介紹 Python 2 種取得當前路徑的方法,分別是 Python os 模組以及 pathlib 模組。

Python os 模組取得當前路徑的方法

這邊介紹 Python os 模組取得當前路徑的方法,使用 os.getcwd() 可以取得當前目錄的絕對路徑,程式碼如下,

python3-get-current-path-1.py
1
2
3
4
5
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

print(os.getcwd())

輸出結果如下,

1
/home/shengyu

Python pathlib 模組取得當前路徑的方法

這邊介紹 Python pathlib 模組取得當前路徑的方法,使用 pathlib.Path().absolute() 可以取得當前目錄的絕對路徑,程式碼如下,

python3-max-2.py
1
2
3
4
5
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pathlib

print(pathlib.Path().absolute())

輸出結果如下,跟上一個範例結果一致,

1
/home/shengyu

以上就是 Python 2 種取得當前路徑的方法的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Python 新手入門教學懶人包

Python PyQt5 QComboBox 下拉式選單用法與範例

本篇 ShengYu 介紹 Python PyQt5 QComboBox 下拉式選單用法與範例,ComboBox 下拉式選單通常適用於讓使用者從多個選項中選擇一個的情境。

以下的 Python PyQt5 QComboBox 用法與範例將分為這幾部分,

  • PyQt5 建立 QComboBox
  • PyQt5 設定 QComboBox 預設的選項
  • PyQt5 取得目前 QComboBox 的選項
  • PyQt5 QComboBox 綁定事件

PyQt5 建立 QComboBox

PyQt5 建立 QComboBox 的用法如下,建立 QComboBox() 後,再用 addItems() 將選項的數值設定進去,這邊我們以水果的選項作為示範,addItems() 接受 list 作為引數,所以這邊我們一次把所有水果的選項一次傳進去。

python-pyqt-qcombobox.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QComboBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mycombobox = QComboBox(self)
self.mycombobox.addItems(['apple', 'banana', 'orange', 'lemon', 'tomato'])
self.mycombobox.move(60, 50)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

QComboBox 的 addItems() 是用來加入多個選項,如果要加入單一選項的話可以使用 addItem(),所以上述範例你也可以這樣寫,

1
2
3
4
5
self.mycombobox.addItem('apple')
self.mycombobox.addItem('banana')
self.mycombobox.addItem('orange')
self.mycombobox.addItem('lemon')
self.mycombobox.addItem('tomato')

PyQt5 設定 QComboBox 預設的選項

PyQt5 要設定 QComboBox 預設選項的話,可以透過 QComboBox.setCurrentIndex() 函式來設定,索引值從 0 開始,第一個選項的索引值為 0,如果設定的索引值超出範圍則會顯示空選項,以下示範設定索引值為 1,另外也可以使用 QComboBox.setCurrentText() 來設定預設的選項文字,如果設定的文字不在選項內的話則會顯示第一個選項。

python-pyqt-qcombobox2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QComboBox)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

self.mycombobox = QComboBox(self)
self.mycombobox.addItems(['apple', 'banana', 'orange', 'lemon', 'tomato'])
self.mycombobox.setCurrentIndex(1)
#self.mycombobox.setCurrentText('banana')
self.mycombobox.move(60, 50)

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 取得目前 QComboBox 的選項

這邊示範按下按鈕顯示目前選取的 QComboBox 選項,QComboBox.currentIndex() 可以取得目前 QComboBox 的選項索引值,而 QComboBox.currentText() 則是取得目前 QComboBox 的選項文字,首先使用 QPushButton.clicked.connect() 先設定按鈕事件的對應處理函式,如下例中的 onButtonClick(),關於 QPushButton 詳細的用法與按鈕事件可以參考這篇,當按下按鈕時在 onButtonClick() 把 mybutton 的按鈕文字設定成當前的 mycombobox 選項索引值跟選項文字。

python-pyqt-qcombobox3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,
QComboBox, QPushButton)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

gridlayout = QGridLayout()
self.setLayout(gridlayout)

self.mycombobox = QComboBox(self)
self.mycombobox.addItems(['apple', 'banana', 'orange', 'lemon', 'tomato'])
gridlayout.addWidget(self.mycombobox, 0, 0)

self.mybutton = QPushButton('button', self)
self.mybutton.clicked.connect(self.onButtonClick)
gridlayout.addWidget(self.mybutton, 1, 0)

def onButtonClick(self):
self.mybutton.setText('idx: ' + str(self.mycombobox.currentIndex()) +
', ' + self.mycombobox.currentText())

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

PyQt5 QComboBox 綁定事件

有時我們會希望當 Combobox 有變動時可以處理這個事件的邏輯,例如下列例子中,當 Combobox 發生改變時就讓 label 顯示對應的選項,這其中就要用到 QComboBox.currentIndexChanged.connect 來連結這個事件對應的處理函式,如下例中的 onComboBoxChanged(),當 Combobox 有改動時就在 onComboBoxChanged() 函式裡讓 mylabel 顯示文字設定成目前 Combobox 的選項文字,關於 QLabel 詳細的用法可以參考這篇

python-pyqt-qcombobox4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,
QComboBox, QLabel)

class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('my window')
self.setGeometry(50, 50, 200, 150)

gridlayout = QGridLayout()
self.setLayout(gridlayout)

self.mycombobox = QComboBox(self)
self.mycombobox.addItems(['apple', 'banana', 'orange', 'lemon', 'tomato'])
self.mycombobox.currentIndexChanged.connect(self.onComboBoxChanged)
gridlayout.addWidget(self.mycombobox, 0, 0)

self.mylabel = QLabel('label', self)
gridlayout.addWidget(self.mylabel, 1, 0)

def onComboBoxChanged(self):
self.mylabel.setText(self.mycombobox.currentText())

if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())

結果圖如下,

以上就是 Python PyQt5 QComboBox 下拉式選單用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
下一篇將會介紹 PyQt5 QRadioButton 單選框用法與範例

其它相關文章推薦
Python 新手入門教學懶人包
Python PyQt5 新手入門教學

C/C++ static member variable 用法與初始化方式

本篇 ShengYu 介紹 C/C++ static member variable 用法與初始化方式,static member variable 初始化方式非常特殊也容易忘記。

C/C++ static member variable

static 放在 class 的 member variable 之前,稱為靜態成員變數 (static member variable),如下範例中的 counter,

1
2
3
4
5
6
7
class Object {
public:
Object() {
}
private:
static int counter;
};

C/C++ static member variable 初始化方式

static class member 無法直接在 class 內初始化,如下範例所示,Object class 裡的 static int counter = 0; 在 class 內初始化 initialize static 成員變數會造成編譯錯誤,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

class Object {
public:
Object() {
++counter;
cout << "counter = " << counter << endl;
}

static int getCounter() { return counter; }
private:
static int counter = 0;
};

int main() {
Object obj1;
Object obj2;
Object obj3;
cout << Object::getCounter() << endl;
return 0;
}

編譯錯誤訊息如下,訊息明確地顯示 C++ 禁止在 class 裡初始化 static member,

1
2
cpp-static.cpp:13:26: error: ISO C++ forbids in-class initialization of non-const static member ‘Object::counter’
static int counter = 0;

那不寫初始化動作呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

class Object {
public:
Object() {
++counter;
cout << "counter = " << counter << endl;
}

static int getCounter() { return counter; }
private:
static int counter;
};

int main() {
Object obj1;
Object obj2;
Object obj3;
cout << Object::getCounter() << endl;
return 0;
}

也是會編譯錯誤,編譯錯誤訊息如下,會在連結 (link) 時期出現 undefined reference 的錯誤,

1
2
3
4
5
6
7
/tmp/ccbvdWOg.o: In function `Object::Object()':
cpp-static.cpp:(.text._ZN6ObjectC2Ev[_ZN6ObjectC5Ev]+0xf): undefined reference to `Object::counter'
cpp-static.cpp:(.text._ZN6ObjectC2Ev[_ZN6ObjectC5Ev]+0x18): undefined reference to `Object::counter'
cpp-static.cpp:(.text._ZN6ObjectC2Ev[_ZN6ObjectC5Ev]+0x1e): undefined reference to `Object::counter'
/tmp/ccbvdWOg.o: In function `Object::getCounter()':
cpp-static.cpp:(.text._ZN6Object10getCounterEv[_ZN6Object10getCounterEv]+0x6): undefined reference to `Object::counter'
collect2: error: ld returned 1 exit status

以下示範正確的 static member variable 初始化寫法,這個範例是計算這個 Object class 被生成了幾個實體 (instance),
靜態成員變數初始化寫在 class 外面,如範例中的 int Object::counter = 0;
靜態成員變數這個技巧概念也被應用在 std::shared_ptr 上,用來追蹤有幾個指標共享一塊記憶體,
另外補充靜態成員函式裡存取的所有變數都要是 static,如下例中的 getCounter()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

class Object {
public:
Object() {
++counter;
cout << "counter = " << counter << endl;
}

static int getCounter() { return counter; }
private:
static int counter;
};

int Object::counter = 0; // initializing the static int

int main() {
Object obj1;
Object obj2;
Object obj3;
cout << Object::getCounter() << endl;
return 0;
}

以上就是 C/C++ static member variable 用法與初始化方式的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它參考
How to initialize private static members in C++?
https://www.tutorialspoint.com/how-to-initialize-private-static-members-in-cplusplus

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ static 的 5 種用法
C/C++ 新手入門教學懶人包
std::vector 用法與範例
std::deque 介紹與用法
std::queue 用法與範例
std::map 用法與範例
std::unordered_map 用法與範例
std::sort 用法與範例
std::shared_ptr 用法與範例

C/C++ static 的 5 種用法

本篇 ShengYu 介紹 C/C++ static 的用法與範例,C/C++ 使用 static 通常有兩種目的,一種是限制變數的作用域(scope),作用域的意思是變數在程式中可以被存取的範圍,另一種目的則是讓變數生命週期變得跟程式一樣長,C/C++ static 的概念與用法也容易出現在考試或面試的題目裡。

以下 C/C++ static 的用法介紹分別為這幾種,

  • C/C++ 中 static 放在區域變數之前
  • C/C++ 中 static 放在全域變數之前
  • C/C++ 中 static 放在函式之前
  • C++ 中 static 放在 class 的 member variable 之前
  • C++ 中 static 放在 class 的 member function 之前

那我們開始吧!

C/C++ 中 static 放在區域變數之前

C/C++ static 放在區域變數之前(該變數宣告在某個函式中)表示該變數離開該作用域(scope)後記憶體還保留著直到程式結束為止,在程式開始時就配置好記憶體,執行到這一行才進行實體化,

cpp-static1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ cpp-static1.cpp -o a.out
#include <iostream>
using namespace std;

void count() {
static int counter = 0;
counter++;
cout << "counter = " << counter << endl;
}

int main() {
count();
count();
count();
return 0;
}

結果輸出如下,

1
2
3
counter = 1
counter = 2
counter = 3

執行到這一行才進行實體化是什麼意思呢?
請看以下範例,透過一個 Counter class 來輔助說明這件事,我們就來看看實際上 Counter 是什麼時候被建構的,

cpp-static2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// g++ cpp-static2.cpp -o a.out
#include <iostream>
using namespace std;

class Counter {
public:
Counter() {
cout << "Counter::Counter()" << endl;
}

~Counter() {
cout << "Counter::~Counter()" << endl;
}

void add(int n) {
c += n;
}

int getCounter() {
return c;
}
private:
int c = 0;
};

void count() {
cout << "count()" << endl;
static Counter counter;
counter.add(1);
cout << "counter = " << counter.getCounter() << endl;
}

int main() {
cout << "main()" << endl;
count();
count();
count();
return 0;
}

輸出結果如下,可以發現程式執行到 static Counter counter; 這一行才開始建構實例化,而且初始化只會有第一次的那一次,一直到程式結束時 Counter 才解構,所以實際上它是跟全域變數的生命週期有點不一樣,全域變數的生命週期是程式開始到程式結束,函式內的 static 變數的生命週期是執行到那一行才初始化然後一直到程式結束,程式輸出如下所示,

1
2
3
4
5
6
7
8
9
main()
count()
Counter::Counter()
counter = 1
count()
counter = 2
count()
counter = 3
Counter::~Counter()

C/C++ 中 static 放在全域變數之前

C/C++ static 放在全域變數之前(該變數不是宣告在某個函式中)是表示在 c/cpp 檔裡該變數無法被其他 c/cpp 檔用 extern 來使用。

因為在別支檔 extern 該變數後,就可以在別支檔裡修改這個變數,所以 static 放在全域變數是預防其它人把竄改你的變數,也有保護變數的味道,這就是 static 放在全域變數之前的主要功用。

以下範例分成 cpp-static3.cpp 與 counter.cpp 來說明,先用 g++ 對 cpp-static3.cpp 與 counter.cpp 各自編譯 g++ -c cpp-static3.cpp && g++ -c counter.cpp,最後再將兩個 .o 檔連結 (link) 最後輸出成 a.out 執行檔 g++ cpp-static3.o counter.o -o a.out

cpp-static3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// g++ -c cpp-static3.cpp && g++ -c counter.cpp
// g++ cpp-static3.o counter.o -o a.out
#include <iostream>
#include "counter.h"
using namespace std;

int counter = 0;

int main() {
count();
count();
count();
return 0;
}

在 counter.h 裡有我們需要呼叫的 count() 函式原型,

counter.h
1
2
3
4
5
6
#ifndef __COUNTER_H__
#define __COUNTER_H__

void count();

#endif

在 counter.cpp 檔裡使用 extern int counter;,代表我想要在 counter.cpp 這支檔裡存取 cpp-static3.cpp 裡的 counter 這個變數,

counter.cpp
1
2
3
4
5
6
7
8
9
10
#include "counter.h"
#include <iostream>
using namespace std;

extern int counter;

void count() {
counter++;
cout << "counter = " << counter << endl;
}

剛剛上面都是介紹 extern 是怎麼使用的,現在要回歸主題了,如果我在 cpp-static3.cpp 裡的 int counter = 0; 前面加上 static 的話,如下範例所示,就表示我不希望 counter 這個變數被其它 .cpp 檔 extern 存取,在實務上有些情況下確實會有這樣需求,這樣能保護我的變數不被別人隨意存取,那麼當別人試圖在別隻檔使用 extern 時(就像前面的 counter.cpp 例子裡的 extern int counter; 那樣)就會出現編譯錯誤,

cpp-static3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// g++ -c cpp-static3.cpp && g++ -c counter.cpp
// g++ cpp-static3.o counter.o -o a.out
#include <iostream>
#include "counter.h"
using namespace std;

static int counter = 0;

int main() {
count();
count();
count();
return 0;
}

延伸閱讀:C/C++ extern 用法與範例

C/C++ 中 static 放在函式之前

C/C++ static 放在函式之前是表示在 c/cpp 檔裡該函式無法被其他 c/cpp 檔用 extern 來引用呼叫,跟前述 static 全域變數是差不多的意思。

C/C++ static 放在函式之前的用意是希望該函式只能在這支原始檔裡使用,不想給別人呼叫,有點像 class 裡的 private function 的味道,反之如果函式之前沒有加 static 的話,任何人都可以透過 extern 的方式來呼叫這支函式。

這邊的範例跟前述例子差不多,只是這個範例沒有 counter.h,取而代之的是在 cpp-static4.cpp 用 extern 的方式引用外部 count 函式,

cpp-static4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ -c cpp-static4.cpp && g++ -c counter.cpp
// g++ cpp-static4.o counter.o -o a.out
#include <iostream>
using namespace std;

extern void count();

int counter = 0;

int main() {
count();
count();
count();
return 0;
}

而 counter.cpp 新增了一個 print_counter 函式專門用來印 counter 的,

counter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

extern int counter;

static void print_counter(int c) {
cout << "counter = " << c << endl;
}

void count() {
counter++;
print_counter(counter);
}

但是如果在 cpp-static4.cpp 嘗試用 extern 的方式引用外部 print_counter 函式來呼叫 print_counter 的話,在編譯時會連結錯誤,

cpp-static4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// g++ -c cpp-static4.cpp && g++ -c counter.cpp
// g++ cpp-static4.o counter.o -o a.out
#include <iostream>
using namespace std;

extern void print_counter(int c); // 連結錯誤, 因為 print_counter 是 static
extern void count();

int counter = 0;

int main() {
count();
count();
count();
print_counter(counter); // 連結錯誤, 因為 print_counter 是 static
return 0;
}

以上就是 C/C++ 中 static 放在函式之前的用法。
延伸閱讀:C/C++ extern 用法與範例

C++ 中 static 放在 class 的 member variable 之前

C++ static 放在 class 的 member variable 之前,稱為靜態成員變數 (static member variable),
靜態成員變數是不屬於任何一個實體 (instance),即所有的實體共享這個變數,
以下就利用靜態成員變數簡單示範如何計算這個 Object class 被生成了幾個實體 (instance),需要注意的是 Object class 的 static int counter 要初始化必須寫在 class 外面,否則編譯器也不讓你通過,
靜態成員變數這個技巧概念也被應用在 std::shared_ptr 上,用來追蹤有幾個指標共享這一塊記憶體,

cpp-static5.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// g++ cpp-static5.cpp -o a.out
#include <iostream>
using namespace std;

class Object {
public:
Object() {
++counter;
cout << "counter = " << counter << endl;
}
private:
static int counter;
};

int Object::counter = 0; // initializing the static int

int main() {
Object obj1;
Object obj2;
Object obj3;
return 0;
}

輸出結果如下,

1
2
3
counter = 1
counter = 2
counter = 3

C++ 中 static 放在 class 的 member function 之前

C++ static 放在 class 的 member function 之前,稱為靜態成員函式 (static member function),
靜態成員函式是不屬於任何一個實體 (instance),即不需要任何實體就可以呼叫該類別的成員函式,
承上例,新增一個 getCounter() 成員函式來取得 counter,我們使用 Object::getCounter() 直接呼叫 Object 類別的 getCounter() 成員函式,即使是還沒有產生任何的實體(例如下例中的 obj1~obj3),需要注意的是靜態成員函式裡存取的所有變數都要是 static,

cpp-static6.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// g++ cpp-static6.cpp -o a.out
#include <iostream>
using namespace std;

class Object {
public:
Object() {
++counter;
cout << "counter = " << counter << endl;
}

static int getCounter() { return counter; }
private:
static int counter;
};

int Object::counter = 0; // initializing the static int

int main() {
cout << Object::getCounter() << endl;
Object obj1;
Object obj2;
Object obj3;
cout << Object::getCounter() << endl;
return 0;
}

輸出結果如下,

1
2
3
4
5
0
counter = 1
counter = 2
counter = 3
3

另外對於 C/C++ static member variable 初始化方式有興趣的可以看這篇

以上就是 C/C++ static 的 5 種用法的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ static member variable 用法與初始化方式
C/C++ 新手入門教學懶人包
std::vector 用法與範例
std::deque 介紹與用法
std::queue 用法與範例
std::map 用法與範例
std::unordered_map 用法與範例
std::sort 用法與範例
std::shared_ptr 用法與範例