PyQt6入门 安装 1 pip install pyqt6 pyqt6-tools
安装后Qt Designer在:
1 .venv\Lib\site-packages\qt6_applications\Qt\bin
PyUic6在:
在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, QtWidgetsfrom 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_Dialogfrom PyQt6.QtWidgets import QApplicationimport sysclass 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 ())
窗口 其他各种控件类均继承这些。
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
同意
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)
1 2 3 4 5 btn1=QPushButton("xxx" ) btn1.setCheckable(True ) btn1.toggle() btn1.setIcon(QIcon(QPixmap("images/python.icon" ))) btn1.setDefault(True )
要组合起来时,把他们放在一个容器中即可。
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()))
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 )
尾声 算了不学了,感觉各种东西千篇一律,用的时候现学吧。