QPushButton按钮
QPushButton 是 PyQt6 里的按钮控件,这篇教学会介绍如何在 PyQt6 窗口里加入 QPushButton 按钮,并进行一些基本的样式设定,以及设定点击按钮后的行为事件。
快速预览:
- 加入 QPushButton 按钮]
- QPushButton 位置设定
- QPushButton 样式设定
- 停用 QPushButton
- QPushButton 点击事件
加入 QPushButton 按钮
建立 PyQt6 窗口物件后,透过 QtWidgets.QPushButton(widget) 方法,就能在指定的控件中建立按钮,下方的程式码执行后,会加入一个 QPushButton 按钮 ,并使用 setText() 方法加入文字。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(320, 240)
btn = QtWidgets.QPushButton(Form) # 在 Form 中加入一个 QPushButton
btn.setText('我是按钮') # 按钮文字
Form.show()
sys.exit(app.exec())
class 写法
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(320, 240)
self.ui()
def ui(self):
self.btn = QtWidgets.QPushButton(self) # 在 Form 中加入一个 QPushButton
self.btn.setText('我是按钮') # 按钮文字
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QPushButton 位置设定
透过下列 QPushButton 方法,可以将 QPushButton 控件定位到指定的位置:
| 方法 | 参数 | 说明 |
|---|---|---|
| move() | x, y | 设定 QPushButton 在摆放的父控件中的 xy 座标,x 往右为正,y 往下为正,尺寸根据内容自动延伸。 |
| setGeometry() | x, y, w, h | 设定 QPushButton 在摆放的父控件中的 xy 座标和长宽尺寸,x 往右为正,y 往下为正,如果超过长宽尺寸,预设会被裁切无法显示。 |
下方的程式码执行后会放入两个 QPushButton,一个使用 move() 定位在 (50,30) 位置,另外一个使用 setGeometry() 方法定位在 (50,60) 的位置并设定大小为 100x50。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(320, 240)
btn1 = QtWidgets.QPushButton(Form)
btn1.setText('按钮 1')
btn1.move(50,30) # 移动到 (50,30)
btn2 = QtWidgets.QPushButton(Form)
btn2.setText('按钮 2')
btn2.setGeometry(50,60,100,50) # 移动到 (50,60),大小 100x50
Form.show()
sys.exit(app.exec())
class 写法
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(320, 240)
self.ui()
def ui(self):
self.btn1 = QtWidgets.QPushButton(self)
self.btn1.setText('按钮 1')
self.btn1.move(50,30) # 移动到 (50,30)
self.btn2 = QtWidgets.QPushButton(self)
self.btn2.setText('按钮 2')
self.btn2.setGeometry(50,60,100,50) # 移动到 (50,60),大小 100x50
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QPushButton 样式设定
如果会使用网页 CSS 语法,就能透过 setStyleSheet() 设定 QPushButton 样式,在设计样式上也较为弹性好用,下方的程式码执行后,会套用 CSS 样式语法,将 QPushButton 变成黄底红字黑色外框的样式 ( 不支援 CSS3 相关语法 )。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(320, 240)
btn = QtWidgets.QPushButton(Form)
btn.setText('按钮')
btn.setGeometry(50,50,100,50)
btn.setStyleSheet('''
background:#ff0;
color:#f00;
font-size:20px;
border:2px solid #000;
''')
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(320, 240)
self.ui()
def ui(self):
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('按钮')
self.btn.setGeometry(50,50,100,50)
self.btn.setStyleSheet('''
background:#ff0;
color:#f00;
font-size:20px;
border:2px solid #000;
''')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
调整 setStyleSheet() 内容,也能做出类似网页按钮 hover 的样式效果,下方的程式码执行后,当滑鼠移动到按钮上方,按钮就会变色。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(320, 240)
btn = QtWidgets.QPushButton(Form)
btn.setText('按钮')
btn.setGeometry(50,50,100,50)
btn.setStyleSheet('''
QPushButton {
font-size:20px;
color: #f00;
background: #ff0;
border: 2px solid #000;
}
QPushButton:hover {
color: #ff0;
background: #f00;
}
''')
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(320, 240)
self.ui()
def ui(self):
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('按钮')
self.btn.setGeometry(50,50,100,50)
self.btn.setStyleSheet('''
QPushButton {
font-size:20px;
color: #f00;
background: #ff0;
border: 2px solid #000;
}
QPushButton:hover {
color: #ff0;
background: #f00;
}
''')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
停用 QPushButton
使用 方法可以「停用」或「启用」QPushButton,停用的 QPushButton 会以「半透明」的方式呈现。setDisabled()
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(320, 240)
btn = QtWidgets.QPushButton(Form)
btn.setText('按钮')
btn.setGeometry(50,50,100,50)
btn.setDisabled(True) # 停用设为 True
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(320, 240)
self.ui()
def ui(self):
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('按钮')
self.btn.setGeometry(50,50,100,50)
self.btn.setDisabled(True)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
如果是使用 setStyleSheet() 方法设定样式,可以从 QPushButton:disabled 的属性设定停用按钮样式。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(320, 240)
btn = QtWidgets.QPushButton(Form)
btn.setText('按钮')
btn.setGeometry(50,50,100,50)
btn.setStyleSheet('''
QPushButton {
font-size:20px;
color: #f00;
background: #ff0;
border: 2px solid #000;
}
QPushButton:disabled {
color:#fff;
background:#ccc;
border: 2px solid #aaa;
}
''')
btn.setDisabled(True)
Form.show()
sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(320, 240)
self.ui()
def ui(self):
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('按钮')
self.btn.setGeometry(50,50,100,50)
self.btn.setStyleSheet('''
QPushButton {
font-size:20px;
color: #f00;
background: #ff0;
border: 2px solid #000;
}
QPushButton:disabled {
color:#fff;
background:#ccc;
border: 2px solid #aaa;
}
''')
self.btn.setDisabled(True)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
QPushButton 点击事件
使用 clicked.connect(fn) 方法可以设定 QPushButton 的点击事件,该方法表示「点击按钮时,会执行 fn 函式」,下方的程式码执行后,点击按钮会执行 show 函式,show 函式会不断地将变数 a 增加 1,再透过 QLabel 显示数字。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(320, 240)
a = 0
def show():
global a
a = a + 1
label.setText(str(a)) # 更新 QLabel 内容
label = QtWidgets.QLabel(Form)
label.setText('0')
label.setStyleSheet('font-size:20px;')
label.setGeometry(50,30,100,30)
btn = QtWidgets.QPushButton(Form)
btn.setText('增加数字')
btn.setGeometry(50,60,100,30)
btn.clicked.connect(show) # 点击时执行 show 函式
Form.show()
sys.exit(app.exec())
class 写法 ( 注意不能使用 show 作为方法名称,会覆写基类的 show 方法造成无法显示 ):
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(320, 240)
self.a = 0 # 设定 a 属性为 0
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setText('0')
self.label.setStyleSheet('font-size:20px;')
self.label.setGeometry(50,30,100,30)
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('增加数字')
self.btn.setGeometry(50,60,100,30)
self.btn.clicked.connect(self.showNum) # 点击时执行 showNum 方法
# 注意不能使用 show 作为 class 内部方法的名称
def showNum(self):
self.a = self.a + 1
self.label.setText(str(self.a)) # 更新 QLabel 内容
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())
如果要执行的函式带有「参数」,则可以使用 lambda 匿名函式处理,下方的程式码执行后,点击 A 按钮就会出现 A 文字,点击 B 按钮就会出现 B 文字。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('千牛编程思维')
Form.resize(320, 240)
def show(e):
label.setText(e) # 显示参数内容
label = QtWidgets.QLabel(Form)
label.setText('A')
label.setStyleSheet('font-size:20px;')
label.setGeometry(50,30,100,30)
btn1 = QtWidgets.QPushButton(Form)
btn1.setText('A')
btn1.setGeometry(50,60,50,30)
btn1.clicked.connect(lambda:show('A')) # 使用 lambda 函式
btn2 = QtWidgets.QPushButton(Form)
btn2.setText('B')
btn2.setGeometry(110,60,50,30)
btn2.clicked.connect(lambda:show('B')) # 使用 lambda 函式
Form.show()
sys.exit(app.exec())
class 写法 ( 注意不能使用 show 作为方法名称,会覆写基类的 show 方法造成无法显示 ):
from PyQt6 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('千牛编程思维')
self.resize(320, 240)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setText('A')
self.label.setStyleSheet('font-size:20px;')
self.label.setGeometry(50,30,100,30)
self.btn1 = QtWidgets.QPushButton(self)
self.btn1.setText('A')
self.btn1.setGeometry(50,60,50,30)
self.btn1.clicked.connect(lambda:self.showText('A')) # 使用 lambda 函式
self.btn2 = QtWidgets.QPushButton(self)
self.btn2.setText('B')
self.btn2.setGeometry(110,60,50,30)
self.btn2.clicked.connect(lambda:self.showText('B')) # 使用 lambda 函式
# 注意不能使用 show 作为 class 内部方法的名称
def showText(self, text):
self.label.setText(text)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec())