5 i+ E& p3 O2 d7 DQtPositioning:包含了定位的类,可以使用卫星、WiFi 甚至文本。( a. l/ W+ I9 p
" N& V n% s! t( p+ ^1 a$ [2 a; F
Enginio:包含了通过客户端进入和管理 Qt Cloud 的类。 - q) G! z5 Z* D3 v , J$ K9 b( ^2 F! uQtWebSockets:包含了 WebSocket 协议的类。 1 S; Q. g- F4 B/ ? $ _$ O# G* A$ u2 `! B* e5 l8 fQtWebKit:包含了一个基 WebKit2 的 web 浏览器。 ; F' Z- q: l# {3 ?! {, \$ H8 x0 Y: z7 b d" f8 A C
QtWebKitWidgets:包含了基于 QtWidgets 的 WebKit1 的类。 : `" E6 P9 j2 D, G4 t; y3 p+ C* F- U0 r( U* ^, p2 O" {, t% ~
QtXml:包含了处理 xml 的类,提供了 SAX 和 DOM API 的工具。; z& T& n S/ e9 ]
. P* |7 Q5 [; v0 N7 v4 F+ e( ?
QtSvg:提供了显示 SVG 内容的类,Scalable Vector Graphics (SVG) 是一种是一种基于可扩展标记语言 (XML),用于描述二维矢量图形的图形格式(这句话来自于维基百科)。. \( s5 t, D5 S" S" D
1 X+ w& \; `, \ Z- PQtSql:提供了处理数据库的工具。 " B# p9 A3 ?! N3 s4 Y* @0 ~3 {) P% q$ t' L" M$ H8 a
QtTest:提供了测试 PyQt5 应用的工具。9 l O$ z2 p6 p9 O1 V
" {" V% s! Y. {( \; A N- G
PyQt5的安装 g8 I; x( g$ j8 M, u+ n5 N
' q1 Q4 P5 Z( j$ h由于后期要使用fbs进行打包,fbs对Python 3.7以后的版本可能存在兼容问题,所以我选择了Python 3.6.8进行了整个环境的搭建。主要内容为:Python + PyCharm + PyQt5 5 {# K2 t' {% n; e / c$ |8 c2 B4 d1 r! } E8 s安装PyQt5 . X. D; a0 N/ J, ]9 W' a) y8 z$ K7 q( }& Q- n& q3 D3 n
pip install pyqt5 $ }; z! B" e& I- N1 J P( b8 @6 ]# i/ w# u6 G
pip install pyqt5-tools; f2 N. o% ?- ?
其中pyqt5-tools为Qt Designer拖拽式的界面设计工具。安装过程中可能会报如下错误: % O- y) {( S3 N8 S4 i# r& w( O6 Z
qt5-tools 5.15.2.1.2 has requirement click~=7.0, but you'll have click 8.0.1 which is incompatible. % U) ^; {4 G# o: r: o' G解决方案: 8 O6 i* i5 v% e. p+ h% J; W" m, x, C. U
pip install click~=7.05 a- B" b0 r( p
Qt Designer的配置 t. I! C; ]2 Y) a/ Z0 `( u# G3 `" b' A7 ?/ W1 O0 p
Qt Designer 是通过拖拽的方式放置控件,并实时查看控件效果进行快速UI设计。5 l) T9 W9 O4 f8 M! f+ |) `% X
/ B; `& W( l! H0 G5 H$ o' N
) f, Z. b2 E( s( u1 J; s, V+ u9 U
; s' Z% v+ F/ q( r a5 ~
整个画面的构成: , c9 Q3 C% w9 Y& k( H ! m: M& Q) d8 m' w6 j2 M) W左侧的“Widget Box”就是各种可以自由拖动的组件/ ]: o% ]" L( _8 Z
S. H0 G& T1 b' ^中间的“MainWindow – untitled”窗体就是画布 ( ^4 I) Y+ C9 e6 }8 S) W" e% Y2 ]; n2 Y s
右上方的”Object Inspector”可以查看当前ui的结构4 P( k$ O) n. p/ C. b9 l% X8 k
" K/ j6 C. Q$ {, _) M9 k- f右侧中部的”Property Editor”可以设置当前选中组件的属性; l# b2 W8 L9 S( m* b
5 Y0 ~: n8 v/ P3 E右下方的”Resource Browser”可以添加各种素材,比如图片,背景等等 7 ~4 H/ x5 k0 O' W% q9 i" i( V2 P
最终生成.ui文件(实质上是XML格式的文件),可直接使用,也可以通过pyuic5工具转换成.py文件。 / C) x' J, e/ ?) W& D: B3 H Q j3 g9 V, K9 w' }4 \' D
QtDisigner配置. j- x1 o' X$ M& L' t
2 P4 M; c9 I- |# I. [, f$ r- O5 o
在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置如下:6 o7 c9 Y4 H' {( K Q. `* p
% T( q7 y$ A1 `; E$ |) Y$ \1 N
Name: QtDisigner2 R6 f C. N- q6 t7 R) Z2 U/ `+ z
: B( |' I' W1 w7 G; j" ?SetGeometry是用来定义 QMainWindow() 窗口的尺寸, 语法:setGeometry(x, y, width, height ),其中x,y为屏幕上的坐标点。 " r6 e9 a) ~+ n1 a" H- Q) W% m. x6 p0 V! I
show():用来显示窗口( G w% ]: T. ?0 c/ s+ X
, @4 Q) h4 }: O4 V4 i% b
exit(app.exec_()):设置窗口一直运行指导使用关闭按钮进行关闭 # k8 @3 ]# @- M- f- C. X4 i ^ 2 C# s3 Z* ?4 g. @ H' J; ]8 k' lPyQt5支持的常见Widgets有: ! f9 Y+ S8 X) h% a9 j, l; r7 l$ F M5 E2 |& s8 H7 e+ p4 g
; F u0 }6 v# w" A
8 ~+ b2 w8 j4 K8 Q从上到下,从左到右依次为:Qlabel、QcomboBox、QcheckBox、QradioButton、QpushButton、QtableWidget、QlineEdit、Qslider、QProgressBar1 K. N3 I' v1 X$ J. X' @$ _6 V* g
6 c$ |% I% s3 L2 N6 e1 v7 f
对于使用Pyqt5设置文本内容,我们使用Qlabel:5 R3 y2 \6 z; A" u. `" R7 E( f
8 m: P1 z/ j5 n3 e* Rimport sys 3 E$ W3 `& S; f% x% X9 U; p( C/ o% l
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel " M9 R: Y5 G. J( S6 K/ R7 `- d, a ~+ B5 u* ~" C( `# |. L4 I7 `
app = QApplication(sys.argv)+ ]4 C1 q3 g, X$ a6 v. m+ u
/ O" C1 a# ^' Z- s8 ?- Q: r
win = QMainWindow() 0 d; I9 d; a1 R* t* x5 c0 \/ f " B1 L2 r9 V7 [0 _win.setGeometry(400, 400, 400, 300)9 f4 E( c/ h2 |" H6 Y8 d3 ^
. _6 Y1 [+ t u* X" ~
win.setWindowTitle("Pyqt5 Tutorial") 2 F. g7 b$ }- p8 a4 z. Q. ^7 @9 z4 r# k& I6 B8 E
\# Label Text+ j# S- Q$ [2 S. x: O, Z5 L
+ X5 L# s3 G% @4 P' L
label = QLabel(win) + \. T0 ^- F. K, B) I1 G- w- n: ` e7 v5 b) _ e4 X/ f8 U7 f
label.resize(200, 100)8 z. X; K* i! ?1 A
/ D; Y) Y% q' u4 g( a) y6 qlabel.setText("Hi this is Pyqt5")* \+ B7 l/ ?* j. v. T
* z0 I( v" W! t# y1 g; L6 }
label.move(100, 100)' k2 b7 w7 }: G j) I- b
) ^8 y6 [/ E! X* E5 S7 hwin.show()% K7 {5 z4 C+ u7 p( t b
8 J# c% }& Q) N4 K
sys.exit(app.exec_()) 6 f. |1 h' v0 H6 X0 u& ?1 U' Y6 N n: L) A, Q# q
. ]' o2 |0 ^4 D- \
2 ?+ G, E. r% P$ d按钮与事件:1 \& Z; Y9 d( u6 T
# `' a6 P. c5 P2 J3 u% l0 F! v
import sys * Z$ [# N5 y/ Q9 v" [5 J5 S2 d4 \
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton 1 W$ t6 H ~( ^9 u, R/ S 5 \3 J% W. b/ q4 F0 H) B8 s7 j" y) tdef click(): 5 z% ?: g1 p- Z : Q0 g4 @1 n$ F# M7 P2 g( |8 h print("Hy Button is clicked!") 1 p. k- a2 Q! j5 m$ |/ P! A5 z! } ?! v2 Y. e
app = QApplication(sys.argv) % x+ i( ?4 a' x8 m/ Y4 U& r4 f; a ) C2 D* g: t0 e' Zwin = QMainWindow() 7 M/ s" d {0 x7 ^6 p6 M/ Z+ f# a* K5 E3 k5 d. j0 X
win.setGeometry(400, 400, 400, 300)3 ^! @. E6 h* q# P+ X3 ~
" q* ^. _0 i" G- j) q$ Gwin.setWindowTitle("Pyqt5 Tutorial")& O: E; z) y2 g
: e0 ]7 G" [ C7 G
\# Button2 m9 G: S+ \5 F7 o1 b
; V# Z# h# t" }
button = QPushButton(win) , {$ `) n! S" @; x; S5 E & @ Q. y" Y8 B: E0 I2 rbutton.resize(200, 100)! W2 ~! g8 |5 b2 e6 B, ]
2 [! R3 o l. x5 @
button.setText("Hi! Click Me")7 G/ Y% I; r7 d ?# A
; C9 T: M5 ^2 S; r1 e \. V
button.move(100, 100) , x5 T6 j& W, x/ D. \ ' {/ v& Z8 F; [& v0 e4 gbutton.clicked.connect(click) O( s% B( K: U! D# g
# H9 `, k' E; n Z+ Bwin.show() : O) i+ V5 E9 z, c 9 M, w" z1 j) A: psys.exit(app.exec_())2 F. h7 i2 I5 \- {* J8 N
- Z6 F {) I2 m3 O! U( ~ \( s0 T$ A6 G! A, w. T
4 N \, q3 s8 A- s+ R1 ybutton.clicked.connect() 在按钮点击后执行特定的事件。( |' A B) C$ e: C9 R$ w
6 `- Y5 e( y) a) |8 yPyQt5实战 . n8 K9 E9 h ?9 E) x , q9 A! N: R, p3 Q% c实战项目:简易的天气查询软件: ?4 w5 z( m- F" O
/ M& D( X( i: [5 F$ n1 v( V2 d. h1、使用Qt Designer设计一个界面7 F1 f/ t' N- x" H* f9 r3 t8 U$ U; W+ t' y
- {$ p! s' s- o/ S' J; l! F3 @0 P
& W: e0 t ^5 m* V/ X3 L用到的控件有Button, GroupBox, Label,ComboBox,TextEdit,同时定义了两个按钮queryBtn及clearBtn,分别用来查询及清空天气数据。我们需要绑定槽函数,方法如下:# ^9 J) T1 [+ b! Q8 Y3 |6 h
, }1 g5 d( v. E k! f: P% i
在Qt Designer右下角选择 信号/槽编辑器,点击+号新增 : O' M7 S) a; i$ v7 k . N* Z: D' G5 A# _9 L分别选择queryBtn及clearBtn,选择信号 clicked(), 接收者 Dialog 及槽 accept(),(槽函数这里不知道如何定义,后期在代码里再进行修改) $ b ?: b E: C6 Y/ h8 i ; M: d. i5 q+ m以上完成后保存为Weather.ui文件。 ) D r) L) h$ B7 r 3 [: F$ C6 v: I: j" Y6 U2、转换.ui文件为.py文件6 a6 p0 f5 e0 j) M2 I$ q
5 U. W2 A7 W9 {, W
PyQt5支持直接使用.ui文件:. m9 {8 j) ]. T6 N& r
7 M' m1 G; K" V/ c M% Q# V
import sys ' x9 \* l; H" Q- g3 U : I& f% j9 }. u; l* ]from PyQt5 import QtWidgets, uic ' N1 D. }3 Z5 b& _7 `+ q; C& l9 p- U
app = QtWidgets.QApplication(sys.argv)' _& j' B& `) E* t- o9 R
: f9 V3 e; A0 V( s W
window = uic.loadUi("mainwindow.ui")# K0 H& R8 t$ @+ a7 A @8 _3 R' w
; }/ s( u, w t# K( N4 d1 awindow.show(): I! A) B8 H _9 @
$ B) R; f2 ^5 Q0 v( i: L$ r( S6 o
app.exec() ; b* O9 u, _) S: i& o但是为了更好的自定义及修改上面的槽函数,可以使用External Tools – PyUIC,即可生成Weather.py,实际运行命令如下:1 a) a Y+ @6 x7 X
1 }" n) K. Q ], n* L
D:\Program Files\Python36\python.exe -m PyQt5.uic.pyuic Weather.ui -o Weather.py 6 Q) v. ]* O7 O2 p2 h其中,我们需要把两个按钮绑定的槽函数:: q& C. `7 h" b$ N9 C8 G+ S% ^( h
" L; p* A5 ]- G( W4 E
\# self.queryBtn.clicked.connect(Dialog.accept)( j! l+ N. q4 N, Z/ E