PyQt6入门

安装

1
pip install pyqt6 pyqt6-tools #其实后面那个就够了

安装后Qt Designer在:

1
.venv\Lib\site-packages\qt6_applications\Qt\bin

PyUic6在:

1
.venv\Scripts

在PyCharm的工具->外部工具,名字建议Qt Designer,程序找上述Qt Designer安装目录,工作目录建议$ProjectFileDir$\ui。PyUic6添加方式类似,程序选Python解释器路径,实参填如下,工作目录同Qt Designer。

1
-m PyQt6.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

新建一个ui文件夹,即可用工具->外部工具打开。

入门

这里界面直接拿Qt Designer做了,要不太费劲了。这里举例输入半径,计算周长和面积,所需控件如下,可试着用Form Layout。

控件类别 对象名称 属性
Dialog windowTitle:”计算园面积”
Label text:“半径=”
Label text:“周长=”
Label text:“面积”
LineEdit leRadius
LineEdit leLength enabled取消勾选,不可输入
LineEdit leArea enabled取消勾选
PushButton pbCal text:“计算”

在对象检查器的Dialog对象右键改变信号/槽,添加槽函数calCircle。单击工具栏上按钮进入“信号/槽”编辑模式。从计算按钮拖出来条接地线,弹出配置窗口中左侧选择clicked(),右侧选择calCircle()。再拖拽半径文本框,左侧选择returnPressed信号,右侧同上。

保存为.ui文件后用PyUic6转为.py文件:

1
pyuic6 -o circleCal_ui.py circleCal.ui

生成的界面源文件需要一些修改:

1
2
3
4
5
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QDialog #这里
class Ui_Dialog(QDialog): #这里
def setupUi(self, Dialog):
#...

新建功能源文件circleCal.py到ui文件夹上级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from ui.circleCal_ui import Ui_Dialog
from PyQt6.QtWidgets import QApplication
import sys
class CircleCal(Ui_Dialog):
def __init__(self):
super(CircleCal,self).__init__()
self.setupUi(self)
def calCircle(self):
r=int(self.leRadius.text())
if r>=0:
length=2*3.14159*r
area=3.14159*r*r
self.leLength.setText(str(length))
self.leArea.setText(str(area))
if __name__=='__main__':
app=QApplication(sys.argv)
dlg=CircleCal()
dlg.show()
sys.exit(app.exec())

窗口

其他各种控件类均继承这些。

QWidget

WindowTitle属性

设置setWindowTitle('xxx'),获取windowTitle()

geometry属性

1
2
3
4
5
6
7
8
9
10
11
#设置
w=QWidget()
w.setGeometry(QtCore.QRect(x,y,宽度,高度))
w.setGeometry(QRect)
w.move(x,y)
w.resize(w,h)
#获取
w.x()
w.y()
w.width()
w.height()

stylesheet属性

1
2
3
4
5
6
7
8
9
10
11
pbStyle="""
QPushButton{
background-color:red;
fireground-color:blue;
font-family:黑体;
font-size:16px;
color:rgb(20,20,255)
font-weight:bold
}
"""
w.setStyleSheet(pbStyle)

windowtype属性

1
2
3
label=QLabel("<font color=blue size=64><b>程序正在启动...</b></font>")
label.setWindowFlags(Qt.WindowType.SplashScreen|Qt.WindowType.FramelessWindowHint)
label.show()

常用枚举类型之窗口类型:

窗口类型 含义
Widget 默认类型
Window 主窗口
Dialog 对话框
SplashScreen 启动窗口
Desktop 桌面
SubWindow 子窗口
ForeignWindow 外部窗口

其他设置属性:

枚举值 含义
MSWindowFixedSizeDialogHint 禁止调整窗口尺寸
FramelessWindowHint 去除边框和标题栏,不可调整、移动窗口
NoDropShadowWindow 去除窗口阴影
CustomizeWindowHint 去除边框和标题栏,可调整
WindowTitleHint 增加窗口标题
WindowSystemMenuHint 增加系统菜单和关闭按钮
WindowMinimizeButtonHint 增加最小化按钮
WindowMaximizeButtonHint 增加最大化按钮
WindowMinMaxButtonsHint 增加最大、小化按钮
WindowCloseButtonHint 增加关闭按钮
WindowContextHelpButtonHint 增加帮助按钮
WindowStaysOnTopHint 将窗口置顶
WindowStaysOnButtonsHint 将窗口置底

QPalette

1
2
3
4
5
6
7
8
9
10
11
w=QWidget()
palette=QPalette()
palette.setColor(QPalette.ColorRole.Window,Qt.GlobalColor.red)
lb=QLabel("xxx",w)
lb.setAutoFillBackground(True)
lb.setPalette(palette)
color=QColor(10,50,255)
color.setNamedColor('#0A32FF')
color.setNamedColor('10,50,255')
te=QTextEdit(w)
te.setTextColor(color)

QFont

1
2
3
4
5
font=QFont()
font.setPointSize(16)
font.setFamily('Arial')
font.setBold(True)
lb.setFont(font)

QDialog

QMessageBox

比较麻烦,这里只讲其常用子类。

1
2
3
reply=QMessageBox.information(self,'标题','文本',QMessageBox.StandardButton.Yes|QMessageBox.StandardButton.No,defaultButton=QMessage.StandardButton.No)
if reply==QMessageBox.StandardButton.Yes:
print("OK!")

常用方法:

方法 用途
information 消息对话框,参数有parent、title、text、defaltButton
question 问答对话框
warning 警告对话框
critical 严重错误对话框
about 关于对话框
setTitle 设置标题
setText 设置消息正文
setIcon 设置弹出对话框的图片

标准按钮类型:

枚举常量 描述 枚举常量 描述
Close 关闭 Open 打开
Ignore 忽略 Retry 重试
No 取消 Save 保存
Ok 同意 Yes 同意

QInputDialog

1
2
3
4
5
6
7
8
9
10
11
12
13
def getText(self):
text,ok=QInputDialog.getText(self,'文本测试','输入姓名:')
if ok:
self.te.setText(str(text))
def getItem(self):
items={"1","2","3","4"}
item,ok=QInputDialog.getItem(self,"选项测试","列表",items,1,True)
if ok and item:
self.te.setText(item)
def getInt(self):
num,ok=QInputDialog.getInt(self,"整数测试","输入成绩:")
if ok:
self.te.setText(str(num))

QFileDialog

1
2
3
4
5
6
7
8
9
10
def TextFile(self):
dlg=QFileDialog()
dlg.setFileNode(QFileDialog.FileMode.AnyFile)
dlg.setFilter(QDir.Filter.Files)
if dlg.exec():
fnames=dlg.selectedFiles()
f=open(fnames[0],'r')
with f:
txt=f.read()
self.te.setText(txt)

控件

QLabel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
label1=QLabel(self)
label2=QLabel(self)
label3=QLabel(self)
label4=QLabel(self)
label1.setText("xxx")
label1.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
label2.setText('<font size="6" color="red">xxx</font>')
label2.setAlignment(Qt.AlignmentFlag.AlignCenter)
label2.setAutoFillBackground(True)
palette=QPalette()
palette.setColor(QPalette.ColorRole.Window,Qt.GlobalColor.white)
label2.setPalette(palette)
label3.setToolTop("xxx")
label3.setPixmap(QPixmap("images/xxx.jpg"))
label4.setText("<a href='xxx'>xxx</a>")
label4.setAlignment(Qt.AlignmentFlag.AlignRight)
label4.setOpenExternalLinks(True)

QLineEdit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
leBH=QLineEdit()
leBH.setPlaceholderText("xxx")
leBH.setInputMask("999999")
leBH.setEchoMode(QLineEdit.EchoMode.Password)
reg=QRegularExpression("[a-zA-Z0-9]+$")
mmValidator=QRegularExpressionValidator(self)
mmValidator.setRegularExpression(reg)
leMM.setValidator(mmValidator)

glIntValidator=QIntValidator(self)
glIntValidator.setRange(1,45)
leGL.setValidator(glIntValidator)

gbDoubleValidator=QDoubleValidator(self)
jbDoubleValidator=setRange(0.00,9999.99)
jbDoubleValidator.setNotation(QDoubleValidator.Notation.StandardNotation)
jbDoubleValidator.setDecimals(2)
leJDGZ.setValidator(jbDoubleValidator)

字符串掩码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A A~Z a~z必需
a,n 允许输入的ASCII字符 非必需
N A~Z a~z 0~9必需
X 任何字符 必需
x 任何字符 非必需
9 0~9 必需
0 0~9 非必需
D 1~9 必需
d 1~9 非必需
# 0~9+- 非必需
H A~F a~f 0~9
h A~F a~f 0~9 非必需
B 01 必需
b 01 非必需
> 所有字母大写
< 所有字母小写
!关闭大小写转换
\ 转义上列字符

QTextEdit

1
2
3
4
5
te.setPlainText("xxx")
te.setTextColor(PyQt6.QtGui.QColor(0,0,255))
tmp=te.toPlainText()
te.setHtml("<font color='red' size='6'>xxx</font>")
te.setPlainText(tmp)

QPushButton

1
2
3
4
5
btn1=QPushButton("xxx")
btn1.setCheckable(True) #是否已被选中
btn1.toggle() #切换按钮状态
btn1.setIcon(QIcon(QPixmap("images/python.icon")))
btn1.setDefault(True) #默认状态

QRadioButton

要组合起来时,把他们放在一个容器中即可。

1
2
3
4
rb1=QRadioButton("xxx")
rb1.setChecked(True)
if rb.isChecked()==True:
#...

QCheckBox

1
2
3
4
5
checkBox1=QCheckBox("&1xxxx")
checkBox1.setChecked(True)
checkBox1.setTristate(True) #设为三态复选框
checkBox1.setCheckState(Qt.CheckState.PartiallyChecked)
print(str(checkBox1.checkState())) #Checked PartiallyChecked Unchecked

QListView

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
listModel=QStringListModel()
self.list=['1','2','3']
listModel.setStringList(self.list)
listView=QListView()
listView.setModel(listModel)
##########
self.list=['1','2','3']
self.mode=QStandardItemModel(4,1)
for i in range(self.mode.rowCount()):
item=QStandardItem(self.list[i])
self.mode.setItem(i,0,item)
self.mode.insertRow(4,QStandardItem("xxx"))
self.listview=QListView()
self.listview.setModel(self.mode)
self.le=QLineEdit()
self.addPb=QPushButton("xxx",clicked=self.addItem)
#...
def addItem(self):
num=self.mode.rowCount()
num=self.le.text()
if s!='':
self.mode.appendRow(QStandardItem(s))
def delItem(self):
num=self.mode.rowCount()
self.mode.removeRow(num-1)
def sortItem(self):
self.mode.sort(0)

尾声

算了不学了,感觉各种东西千篇一律,用的时候现学吧。