Python3 PyQt5 窗口(国际化/QMainWindow/QWidget/QDialog)
本文由 Luzhuo 编写,转发请保留该信息.
原文: https://blog.youkuaiyun.com/Rozol/article/details/87904498
PyQt5基本介绍见: PyQt5 Qt Designer (Qt设计师)
简介
窗口主要分为: QMainWindow(主窗口) / QWidget(基本窗口) / QDialog(对话框) 这三种.
- QWidget: 最基本的窗口
- QMainWindow: 在 QWidget 的基础上多了 菜单栏 / 工具栏 / 状态栏 / 标题栏 等
- QDialog: 对话框窗口
使用的话:
1.如果是主窗口, 需要菜单栏之类的, 就用QMainWindow.
2.如果是对话框, 就用QDialog.
3.其他不确定的窗口, 都可以用QWidget.
文本国际化
这里先讲下文本国际化, 如果不进行国际化, 那么你运行之后, 发现控件都是英文的.
自带的国际化
PyQt5自带的翻译文件在C:\Code\Python_Vir\python1\Lib\site-packages\PyQt5\Qt\\translations\
目录下, 不过翻译并不完全, 由于已经被编译成.qm
文件, 你也改不了它.
from PyQt5.Qt import QTranslator, QLocale, QLibraryInfo
translator = QTranslator(app)
if translator.load("qt_" + QLocale.system().name(), QLibraryInfo.location(QLibraryInfo.TranslationsPath)):
app.installTranslator(translator)
效果:
自定义的国际化
编写文本时, 有原来的"content"
变成现在的self.tr("content")
, 其他除了要先加载翻译者之外, 均不变.
def initUI(self):
# 加载翻译文件
translator = QTranslator(app)
if translator.load('qt_zh_CN'):
app.installTranslator(translator)
btn = QPushButton(self.tr("Color"), self)
btn.clicked.connect(self.click)
self.setGeometry(300, 300, 550, 350)
self.setWindowTitle('Dialog')
self.show()
btn = QPushButton(self.tr("Color"), self)
btn.clicked.connect(self.click)
def click(self):
QColorDialog.getColor()
1.生成.ts文件
# 创建.ts文件, 存在则更新
pylupdate5 international.py -ts qt_zh_CN.ts
2.打开Linguist进行手动翻译, 翻译完点保存
linguist qt_zh_CN.ts
3.生成.qm文件
lrelease qt_zh_CN.ts
效果:
自己写的是实现了国际化, 原生的英文界面你也拿它没辙.
另外翻译出现问题可以通过修改.ts来修正.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>Widget</name>
<message>
<location filename="international.py" line="24"/>
<source>Color</source>
<translatorcomment>颜色</translatorcomment>
<translation>颜色</translation>
</message>
</context>
</TS>
比如代码位置变了, 会给你打个过时的标签, 如
<translation type="obsolete">取消</translation>
这时只需要把type="obsolete"
删掉, 然后把line="24"
改成正确的行就行了.
另外, 其实翻译只需要<translation>颜色</translation>
标签就够了, <translatorcomment>颜色</translatorcomment>
可有可无.
自带的国际化 + 自定义的国际化
只需要同时加载两个翻译者就好了.
def initUI(self):
# 加载翻译文件
translator_sys = QTranslator(app)
translator_my = QTranslator(app)
if translator_sys.load("qt_" + QLocale.system().name(), QLibraryInfo.location(QLibraryInfo.TranslationsPath)) and translator_my.load('qt_zh_CN'):
app.installTranslator(translator_sys)
app.installTranslator(translator_my)
btn = QPushButton(self.tr("Color"), self)
btn.clicked.connect(self.click)
self.setGeometry(300, 300, 550, 350)
self.setWindowTitle('Dialog')
self.show()
def click(self):
QColorDialog.getColor()
效果:
如果需要切换语言
app.removeTranslator(translator_my)
app.installTranslator(translator_sys)
注: 为了敲代码效率, 我的所有案例代码都不会用self.tr("xxx")
这种方式来写, 而是直接写"xxx"
, 包括这篇文章的以下代码.
QMainWindow 主窗口
QMainWindow 是一个顶层窗口(没有父窗口), 包含了 MenuBar(菜单栏) / ToolBars(工具栏) / Dock Widgets(停靠控件区) / Status Bar(状态栏), 中心窗口区被一个 QWidget 占着, 可通过setCentralWidget()
来设置(不能通过 setLayout() 设置).
创建主窗口
我们有两种方式创建, 第一种是创建对象, 第二种是继承类, 一般我们会采用第二种, 包括博客文章的案例代码采用这种方式.
第一种: 创建对象方式
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2019/2/19'
# QMainWindow 创建主窗口
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QIcon
def mainwindow1():
'''
方式一: 通过创建对象方式创建主窗口
'''
# 每个PyQt5应用都要创建一个应用对象 (sys.argv是一组命令行参数列表)
app = QApplication(sys.argv)
# 主窗口
w = QMainWindow()
w.setGeometry(300, 300, 550, 350)
w.setWindowTitle('我是窗口标题')
w.setWindowIcon(QIcon('icon.png')) # 设置图标
w.show() # 展示该控件
# 退出主程序
sys.exit(app.exec_())
if __name__ == '__main__':
mainwindow1()
第二种: 继承类方式
class MainWindow(QMainWindow):
'''
方式二: 通过继承类方式创建主窗口
'''
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 550, 350)
self.setWindowTitle('我是窗口标题')
self.setWindowIcon(QIcon('icon.png')) # 设置图标
self.show() # 展示该控件
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
sys.exit(app.exec_())
效果:
窗口位置与大小
我们有三种方式设置窗口的位置与大小:
第一种:
self.resize(550, 350) # 改变窗口大小(px)
self.move(300, 300) # 移动控件位置(px)
第二种 (是第一种两方法的结合):
self.setGeometry(300, 300, 550, 350) # 放在屏幕上并设置大小
第三种 (居中显示):
qr = self.frameGeometry() # 得到应用主窗体大小
cp = QDesktopWidget().availableGeometry().center() # QDesktopWidget 得到桌面大小, availableGeometry 得到屏幕分辨率, center 得到中间点坐标
qr.moveCenter(cp) # 将 应用中间点 移到 屏幕中间点
self.resize(550, 350)
self.move(qr.topLeft()) # 将 应用左上标 设为 矩形左上标
窗口的几何结构:
窗口分为 不含外边框的几何结构 和 含外边框的几何结构.
# --- 无边框几何结构 ---
# 修改客户区的大小(鼠标可修改)
self.resize(550, 350)
self.resize(QSize(550, 350))
self.setGeometry(300, 300, 550, 350)
self.setGeometry(QRect(300, 300, 550, 350))
# 修改客户区的大小(鼠标不可修改)
self.setFixedWidth(550) # 宽度固定 (高度可变)
self.setFixedHeight(350) # 高度固定
self.setFixedSize(550, 350) # 宽度与高度都固定
self.setFixedSize(QSize(550, 350))
# 获取客户区大小
qsize = self.size()
qrect = self.geometry()
width = self.width()
height = self.height()
print("QSize - width:{w} height:{h}".format(w=qsize.width(), h=qsize.height()))
print("QRect - x:{x} y:{y} width:{w} height:{h}".format(x=qrect.x(), y=qrect.y(), w=qrect.width(), h=qrect.height()))
print("width:{w} height:{h}".format(w=width, h=height))
# --- 有边框几何结构 ---
# 设置窗口位置
self.move(300, 300)
self.move(QPoint(300, 300))
# 获取窗口位置与大小
qrect = self.frameGeometry() # 位置和大小
qpoint = self.pos() # 左上角坐标
print("QRect - x:{x} y:{y} width:{w} height:{h}".format(x=qrect.x(), y=qrect.y(), w=qrect.width(), h=qrect.height()))
print("QRect - x:{x} y:{y}".format(x=qpoint.x(), y=qpoint.y()))
关闭窗口
关闭窗口, 除了点击右上角的红×退出外, 还有自己写退出的逻辑(与退出槽连接).
退出应用的信号槽连接:
qbtn.clicked.connect(QCoreApplication.instance().quit)
完整代码:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtCore import QCoreApplication
class MainWindow(QMainWindow):
'''
退出窗口
'''