' o$ h. [6 _+ ~, ^3 _% F4 [PyQt5支持的常见Widgets有:. s3 _; \, R7 \& R
. q: T- a) U1 Z) Y7 d/ m* n
# Q/ |1 I% n# u) h: {; S3 F
|) i7 ?0 [6 E! t8 u4 u
从上到下,从左到右依次为:Qlabel、QcomboBox、QcheckBox、QradioButton、QpushButton、QtableWidget、QlineEdit、Qslider、QProgressBar6 Q5 W+ {# Y7 J. E6 c1 Q8 U! `
H6 v1 ?0 ?. N2 q" O0 H6 C
对于使用Pyqt5设置文本内容,我们使用Qlabel: " R% D5 A7 F, I6 A8 m( K9 Y3 Z$ D" `5 T' s2 [. x$ N
import sys1 W/ N& _0 b A3 ^" w; c
& A/ u+ l% W% n- n7 x
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel- D, _- Q3 u# u. I
, I# i% B7 j% Z
app = QApplication(sys.argv) 2 A( [/ M7 _, X& |" f 5 i; o; N6 D, d* Ywin = QMainWindow() 1 y) s8 `, q1 v, ~8 R . U7 o1 O6 |% U! B) v7 \6 @4 x9 ^' b0 Bwin.setGeometry(400, 400, 400, 300)' l, F) [5 V n) H
& n2 A6 u. _3 R! d1 r
win.setWindowTitle("Pyqt5 Tutorial"), I. { s$ O( U8 c/ k
1 N8 j- p$ ^9 r' k\# Label Text* q) o6 C' D4 ?
6 [2 V; A, r8 h5 Y7 ?; ulabel = QLabel(win)+ v# i# _' U4 f/ K8 ~+ T0 [
' d& M; h+ k" O' T D: R
label.resize(200, 100) 6 F) F1 c$ i# m- |5 B" I% } & \, G8 Y' _( c" n' Ylabel.setText("Hi this is Pyqt5")( W+ V; }; J/ m2 n
% G8 L5 g9 ~4 Ylabel.move(100, 100) & w% G1 Y% `; p' c( F" M* I( g% T 8 \# {5 I- [7 w* m3 c/ Z, C) Owin.show() - W3 B. a. K; ]7 W # d; t" }& C: ^& P5 n% p0 @sys.exit(app.exec_()). m: x+ m) r3 M! q5 u+ J
# n8 k" v1 C; I0 S/ L% ]( f 1 P- t2 n R1 p. } A+ W9 @7 A 1 G1 o6 h& d( q; A' H, `按钮与事件:9 U+ @. U0 p( E' O" ?+ j5 v/ y3 R
! p6 c- K9 o) U2 t: Fimport sys 2 h0 Y2 M/ O# f @' \4 N / @3 n2 f6 _% z% ~0 j5 {- rfrom PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton5 Q2 G# s, @' \9 y q& I
! I; n6 D4 ?8 n4 y( J6 q8 N; d3 n
def click():1 D6 l0 ~( J- ]5 h. P ~
0 V j+ W. g/ K: B" w8 M5 J/ C" e
print("Hy Button is clicked!") |' ~; M6 m/ W: p9 U9 K9 P
+ s4 L9 g6 R9 o1 c. Xapp = QApplication(sys.argv)! M+ g9 @2 W3 B
" A) D S8 l, j9 }) z. ]* x- Iwin = QMainWindow() 5 n0 P( u. p! h A; u) l& `; j! I$ }; X* h+ d4 u
win.setGeometry(400, 400, 400, 300)2 J6 m. J. {, X& P. t
$ Y' y7 w% v0 X/ J! D
win.setWindowTitle("Pyqt5 Tutorial") ) k5 E+ {# G. h% ]/ } - N/ j$ K& j& q5 s# M2 P" Y\# Button 8 u' n! |, p9 A n , c. O" b. S: P' r- Pbutton = QPushButton(win)/ K# l+ u. @" q7 @1 d7 l
) o- |# W7 ^* @button.resize(200, 100)- c! R# I5 Y* G R. G0 {+ g
* o1 x) C' j) A6 D9 Sbutton.move(100, 100) ) t" y$ }' y+ r7 ]* E/ F& d4 O4 E+ Q- d- h
button.clicked.connect(click) 9 \. B5 \+ j) q3 h* _$ x# N. C* W' p2 m u' |& I7 n
win.show() . F3 j+ T* R t5 m7 Y7 a: ^; {& V2 |7 ^# D- B2 }. V% e! M
sys.exit(app.exec_())4 m$ ^% I( ^9 {. k
2 w7 J( s, e7 |
8 H" w v Q. x/ h4 |0 X: l% a' C+ M; ^, |% K
button.clicked.connect() 在按钮点击后执行特定的事件。 # {: k1 s; T; V& H2 [3 d1 K1 i; P {+ A0 ?# O; ]
PyQt5实战! f: N- F, Y6 J( z% M5 }6 b, f) r
- b! I3 n; l! q( v6 l K, Q- A) t9 @实战项目:简易的天气查询软件 7 I, g; L% y& N h# L. J4 z + L8 w d! O" Y3 f/ f1、使用Qt Designer设计一个界面 9 q* s" Y: y; A, b* x V- G# r3 J" e9 T) J
6 G) o+ c& y6 Z* x
- I ?. V; _- R2 e. z2 u* x
用到的控件有Button, GroupBox, Label,ComboBox,TextEdit,同时定义了两个按钮queryBtn及clearBtn,分别用来查询及清空天气数据。我们需要绑定槽函数,方法如下: , D3 u- q# i' L4 L* ]6 s6 X9 p7 ~( t S/ C5 G( V0 X. p, i
在Qt Designer右下角选择 信号/槽编辑器,点击+号新增& u7 C' m5 m' y" F- s
6 F# z" ^5 o$ e$ s6 ^/ a
分别选择queryBtn及clearBtn,选择信号 clicked(), 接收者 Dialog 及槽 accept(),(槽函数这里不知道如何定义,后期在代码里再进行修改)6 W, a0 u. ]( K: C: t
! y# H3 _: @- ~/ S; C
以上完成后保存为Weather.ui文件。1 N$ z8 m2 S, f2 a, S9 G6 m' [
: d ?, w8 o4 O% F5 C8 x2、转换.ui文件为.py文件 6 q- A, o# l) b3 }6 a 2 r! d9 @; B! |' q, R# OPyQt5支持直接使用.ui文件: ) n$ o* f' t, ^$ x7 L7 A7 I+ m& l6 F) F7 J: S: P1 Y4 Z
import sys5 Q/ Z; E3 g4 z9 ]
3 |3 r6 }6 [. B+ s( Pfrom PyQt5 import QtWidgets, uic / s' c# Y: U0 i % \# a' U; k/ Gapp = QtWidgets.QApplication(sys.argv) . i7 E! X) j3 g4 z : u- C- |' A, Ywindow = uic.loadUi("mainwindow.ui")7 o" O w* d* y
! g; r9 }+ {( m& S9 I
window.show()) v" `1 \! W) H" V2 P
0 d* S: T5 n# g" Y* t D
app.exec() ) J5 g$ `8 s3 I* i但是为了更好的自定义及修改上面的槽函数,可以使用External Tools – PyUIC,即可生成Weather.py,实际运行命令如下:+ s6 L; Q5 [" P; D2 d5 W
1 j/ K& j+ B; o( E% r
D:\Program Files\Python36\python.exe -m PyQt5.uic.pyuic Weather.ui -o Weather.py0 I7 O. ^' P+ a3 C4 o* G
其中,我们需要把两个按钮绑定的槽函数:, G& ^. N. a$ @
% Y H t- t3 Y- G9 s5 H1 G
\# self.queryBtn.clicked.connect(Dialog.accept). K3 z. y; Y7 j6 u0 u
9 ^) x# _3 h' _$ `' `\# self.clearBtn.clicked.connect(Dialog.accept)0 u2 _- j. r* i
+ B" C- F4 E/ I+ V+ K8 t( x
\# 修改为:# _3 X* e" t/ e
7 ^4 y$ h$ m. hself.queryBtn.clicked.connect(Dialog.queryWeather) 1 w+ S4 Z; K+ c% a5 a( i- C# W9 E- l7 \5 L- q
self.clearBtn.clicked.connect(Dialog.clearText)/ _0 F- k |7 K9 M1 A a+ R! |0 a
最终的Weather.py内容如下: 7 _' E- E8 A) W" H3 J) g7 I# ]; B% |' O
\# -*- coding: utf-8 -*-- a5 b" p: M t R
/ ~/ i# e# W: X) J
\# Form implementation generated from reading ui file 'Weather.ui' % e; {' X( l2 P/ z# P : g8 T. _) m2 n7 G8 A' p\## J& V: e2 l" Y" a4 u) [
* e# J% O' x8 s
\# Created by: PyQt5 UI code generator 5.15.4 , M% H7 g% U$ x& M. k. C/ s : ?+ q* P4 A% @& P8 K\#7 P n h9 q# d" l, q9 M9 u
& \& L Q6 D, C& a/ [$ `: W( ]\# WARNING: Any manual changes made to this file will be lost when pyuic5 is & j Y7 h" @ n" C! z , Z; m: R/ c$ ^& L\# run again. Do not edit this file unless you know what you are doing.1 L" U0 v# z0 q: W+ R( L/ C
# [$ \" x% }8 y, m9 P# n
from PyQt5 import QtCore, QtGui, QtWidgets8 w* t/ k- k( a5 f( |/ p
" T5 X4 P0 @3 Y" G2 k0 C
class Ui_Dialog(object):, B6 s" I ~. O& C, U
$ h. Y/ G" Y" U7 g3 d# ~3 |% F+ ]
def setupUi(self, Dialog):* Q8 F' z+ T! q3 r. U Y8 `
5 z" g# T+ F) j( H
Dialog.setObjectName("Dialog")2 G: j4 L4 s( l8 e8 `
1 S; [; ?& \6 o; E7 \# A Dialog.resize(600, 600) + W: Q# u& f C& U" K4 e: S1 P$ `, s7 d" n3 P
self.groupBox = QtWidgets.QGroupBox(Dialog) : j$ _9 S, O+ M " v& j5 l+ p$ s! P6 f. U self.groupBox.setGeometry(QtCore.QRect(30, 20, 551, 511)) ' i2 L. c# m/ a/ V u8 q! f0 Q' \( P* p
self.groupBox.setObjectName("groupBox") , u& s, V5 M0 h, s6 K+ f/ M4 U: c n& K: A
self.label_2 = QtWidgets.QLabel(self.groupBox) ! {" i; _: M6 u9 r0 e x' j: O# k) Q 9 J- V) U. h7 {) Q1 ]$ {8 @2 g: u self.label_2.setGeometry(QtCore.QRect(20, 30, 31, 16))- t4 a1 k' U7 ~& ~- y
$ p! @7 a# u2 t# n% w* b; v
self.label_2.setObjectName("label_2") ; V( g' b# p4 M9 c3 H" m8 _6 o" \2 @$ E* ?2 k7 ~5 q
self.comboBox = QtWidgets.QComboBox(self.groupBox) + m2 }/ R# ~7 h2 E6 m8 C' y }/ m! v1 {" y7 K) O! a% L
self.comboBox.setGeometry(QtCore.QRect(70, 30, 87, 22))! @+ S- T; a9 `/ _# p; m& o# j: W
4 ^/ N& K6 t4 E: p% y$ h8 m; j( C self.comboBox.setObjectName("comboBox")2 f1 x# g1 g7 m
; z B* \1 H& r; u9 I
self.comboBox.addItem("") 2 K" r: \! s+ J6 i# x- I& `. I& |1 E I. z% ^: a1 U9 E: B7 m self.comboBox.addItem("")! j/ n* @! e" M6 [; h! i9 C
9 B8 a8 `' a/ b: j' o: u
self.comboBox.addItem("") 7 }4 I: \; I) y; Y" F+ h2 {8 M J
self.textEdit = QtWidgets.QTextEdit(self.groupBox) . S q' j% T$ a1 @$ G" }" k( _* T v+ z0 b
self.textEdit.setGeometry(QtCore.QRect(20, 70, 491, 411)) 6 {0 @4 x b9 K 9 w7 [, k2 V9 ^' b6 ~/ S! b9 M self.textEdit.setObjectName("textEdit")8 V/ }4 E# S7 [6 w/ [' A0 s* k6 q
/ i7 D, w" X' x3 s. X9 H self.queryBtn = QtWidgets.QPushButton(Dialog), R7 w1 U& E. N6 n% {
6 z- h' d, W3 F+ J
self.queryBtn.setGeometry(QtCore.QRect(490, 560, 93, 28))7 t; ^3 m) E- c. `8 v1 m M! a2 C
+ J6 y/ ~2 e- ]! p- b- }. l self.queryBtn.setObjectName("queryBtn")9 o& l# ^) X! w6 M
* }9 ~5 W5 Z/ y g, s+ l. \. Z. k2 ]
self.clearBtn = QtWidgets.QPushButton(Dialog) 0 n+ w) @! ]7 x$ ^& _ T3 c* ]
self.clearBtn.setGeometry(QtCore.QRect(30, 560, 93, 28))$ [ m8 S' n: Y+ m/ N, h