说明:
参考的博客资料等都在文中有所标记,只是一个自我学习的过程,如果有什么不合适的地方请联系我,欢迎大家相互学习交流进步。
(一):安装
安装不多说,自己就那3个外部工具搞了很久,后来换了一个虚拟环境好了
PyCharm安装配置PyQt5/QtDesigner/PyUic的超详细教程-优快云博客
(二):上手第一个demo
[PyQt5应用实例]获取城市天气预报_pyqt5 北京上海苏州 天气-优快云博客
其中最后的打包为exe我还没做
参考代码如下:
weather.py
import sys
import weather
from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow
import requests
class MainDialog(QMainWindow):
def __init__(self, parent=None):
super(QMainWindow, self).__init__(parent)
self.ui = weather.Ui_MainWindow()
self.ui.setupUi(self)
def queryWeather(self):
cityName = self.ui.comboBox.currentText()
cityCode = self.getCode(cityName)
r = requests.get("http://t.weather.sojson.com/api/weather/city/{}".format(cityCode))
print(r.json())
if r.json().get('status') == 200:
weatherMsg = '城市:{}\n日期:{}\n天气:{}\nPM 2.5:{} {}\n温度:{}\n湿度:{}\n风力:{}\n\n{}'.format(
r.json()['cityInfo']['city'],
r.json()['data']['forecast'][0]['ymd'],
r.json()['data']['forecast'][0]['type'],
int(r.json()['data']['pm25']),
r.json()['data']['quality'],
r.json()['data']['wendu'],
r.json()['data']['shidu'],
r.json()['data']['forecast'][0]['fl'],
r.json()['data']['forecast'][0]['notice'],
)
else:
weatherMsg = '天气查询失败,请稍后再试!'
self.ui.textEdit.setText(weatherMsg)
def getCode(self, cityName):
cityDict = {"北京": "101010100",
"上海": "101020100",
"天津": "101030100"}
return cityDict.get(cityName, '101010100')
def clearText(self):
self.ui.textEdit.clear()
if __name__ == '__main__':
myapp = QApplication(sys.argv)
myDlg = MainDialog()
myDlg.show()
sys.exit(myapp.exec_())
stat.py
import sys
import weather
from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow
import requests
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(QMainWindow, self).__init__(parent)
self.ui = weather.Ui_MainWindow()
self.ui.setupUi(self)
def queryWeather(self):
cityName = self.ui.comboBox.currentText()
cityCode = self.getCode(cityName)
r = requests.get("http://t.weather.sojson.com/api/weather/city/{}".format(cityCode))
print(r.json())
if r.json().get('status') == 200:
weatherMsg = '城市:{}\n日期:{}\n天气:{}\nPM 2.5:{} {}\n温度:{}\n湿度:{}\n风力:{}\n\n{}'.format(
r.json()['cityInfo']['city'],
r.json()['data']['forecast'][0]['ymd'],
r.json()['data']['forecast'][0]['type'],
int(r.json()['data']['pm25']),
r.json()['data']['quality'],
r.json()['data']['wendu'],
r.json()['data']['shidu'],
r.json()['data']['forecast'][0]['fl'],
r.json()['data']['forecast'][0]['notice'],
)
else:
weatherMsg = '天气查询失败,请稍后再试!'
self.ui.textEdit.setText(weatherMsg)
def getCode(self, cityName):
cityDict = {"北京": "101010100",
"上海": "101020100",
"天津": "101030100"}
return cityDict.get(cityName, '101010100')
def clearText(self):
self.ui.textEdit.clear()
if __name__ == '__main__':
myapp = QApplication(sys.argv)
myMainWin = MainWindow()
myMainWin.show()
sys.exit(myapp.exec_())
(三):窗口介绍
ctrl+R开启窗口预览
参考:
https://blog.youkuaiyun.com/xiaowang_csdn/category_12199680.html
手把手教你学习PyQT5:打造精美、功能强大的桌面应用程序(更新中。。)-优快云博客
1:QMain Window
在QMainWindow中,中心窗口是最重要的部分,它可以是任何Qt窗口部件,如QTextEdit、QTableView、QGraphicsView等
QMainWindow的一些常用成员函数包括:
setCentralWidget():设置中心窗口部件
setMenuBar():设置菜单栏
addToolBar():添加工具栏
statusBar():获取状态栏
show():显示主窗口
总的来说,QMainWindow是一个非常强大的窗口部件,它可以用于创建各种类型的应用程序界面,如主窗口应用程序、多文档应用程序等。我们通常创建的是这个窗口
2:Qwidget
Qt框架中所有用户界面部件的基类,包括窗口、对话框、按钮、标签、文本框、图形视图等等。QWidget提供了一些基本的用户界面功能,例如绘制、事件处理、布局等。
在Qt中,所有的用户界面部件都是从QWidget派生而来的,这意味着QWidget提供了一个通用的接口,以便于在不同的用户界面部件之间共享代码和实现。同时,QWidget也提供了一些常用的属性和方法,例如size()、pos()、setWindowTitle()等,以便于管理和操作界面部件。
在创建自定义用户界面部件时,我们可以从QWidget派生出我们自己的部件类,并通过重载其成员函数来实现自定义行为。例如,我们可以通过重载QWidget的paintEvent()函数来绘制自己的部件,或者通过重载其mousePressEvent()函数来处理鼠标点击事件。
两者的区别:
而QMainWindow是QWidget的子类,是Qt框架中的一个主窗口类,它提供了一个应用程序的主界面,可以包含菜单栏、工具栏、状态栏、中心窗口等各种窗口部件。
QMainWindow作为应用程序主窗口,它是顶层窗口,而QWidget可以是顶层窗口或其他窗口的子窗口。
QWidget可以作为独立窗口创建,也可以作为其他窗口的子窗口创建,而QMainWindow只能作为应用程序主窗口创建。
外加:QDialog: 是对话窗口的基类,没有菜单栏、工具栏、状态栏。
(四):控件以及事件
1:Layouts
就是对齐/布局
Qt6教程之二(1) 布局 Layouts_qt怎么拖布局-优快云博客
2:Spacers
就是在缩放界面的时候的一个弹簧,可以自动调节元素直接的间隔
Qt6教程之二(2) Spacers_qt spacer-优快云博客
五个按钮就会随着窗口的缩放而自动 “收弹” 了
3:Buttons
(1):push button
Qt6教程之二(3) Buttons_qt pushbutton-优快云博客
编写好框架文件以后,启动代码
import sys
import learing_test
from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(QMainWindow, self).__init__(parent)
self.ui = learing_test.Ui_MainWindow()
self.ui.setupUi(self)
if __name__ == '__main__':
myapp = QApplication(sys.argv)
myMainWin = MainWindow()
myMainWin.show()
sys.exit(myapp.exec_())
(2):tool button
Qt6教程之二(3) Buttons_qt pushbutton-优快云博客
同时还多一个trigered信号,就是实现弹出菜单,然后咱们点击了哪一项action,发射的信号。
但是这个trigered暂时使用GUI界面的操作无法实现
(3):radio button 单选框按钮
radio button称为单选框按钮,当多个radio button同属于一个父组件时,只能选择一个单选按钮,多个按钮之间形成互斥关系!
实现单选框按钮的事件,就是绑定信号与槽
也是可以实现选择然后关闭程序的,和push button的功能有部分一样
QRadioButton 没有自己独有的信号,可以使用pressed、released、clicked、toggled等信号。由于QRadioButton常用作选择按钮,需要判断选择状态,所以toggled信号比较常用,使用void toggled(bool checked);信号可以获得该按钮的选中状态
(4):check box
check box是一个带文本标签的浮选框,这意味着当同一父组件下存在多个check box时,可以选中多个,与radio button刚好相反。
对于复选框,最常用的功能就是检测是否选中,信号为stateChange
(5):command link button
command link button是命令链接按钮,可以显示图标和文字,常用于向导和对话框中的单选按钮的替代。可以在右侧的属性栏设置图标、文字等
目前为止,我们所有的控件实现的功能都是触发以后进行窗口的关闭
(6):dialog button box
dialog button box是一个包含很多按钮的控件,可以向QDialogButtonBox
添加按钮,QDialogButtonBox
会根据平台自动使用合适的布局。
4:Containers
(1):Group Box
使用QGroupBox
来分组相关的控件,如单选按钮。
(2):Scroll Area
创建一个QScrollArea
,在其中放置一个大控件。
太长自己会生成 滚动区域
(3):Tool Box
使用QToolBox
来创建带有折叠面板的容器。
可以点击panel切换当前版面的小界面
(4):Tab Widget
创建一个QTabWidget
,其中包含多个标签页。
(5):Stacked Widget
使用QStackedWidget
来创建一个堆叠的控件容器。
(6):Frame
QFrame
可用于创建一个简单的容器,常常用于绘制边框和分隔内容。
(7):Widget
QWidget
是PyQt5中所有用户界面对象的基类,也可以作为一个通用的容器。
(8):MDI Area
QMdiArea
提供了一个多文档接口(MDI),允许管理多个子窗口。
(9):Dock Widget
QDockWidget
提供了可停靠的控件,这些控件可以被移动和重新停靠在主窗口的不同位置。