QPushButton按钮

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())

Back to top: