Python3 PyQt5 窗口(国际化/QMainWindow/QWidget/QDialog)

Python3 PyQt5 窗口(国际化/QMainWindow/QWidget/QDialog)


本文由 Luzhuo 编写,转发请保留该信息.
原文: https://blog.csdn.net/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):
    '''
    退出窗口
    '''
    
  • 16
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Python和PyQt5,实现不同窗口下多界面切换模板,可以通过以下步骤来实现: 1. 导入PyQt5库,创建窗口 在Python中,我们可以使用PyQt5库来创建GUI应用。通过导入PyQt5库和创建一个QMainWindow(主窗口)对象,即可创建一个GUI窗口。 2. 创建多个窗口界面 接下来,我们可以创建多个需要切换的界面,每个界面都作为一个Python类来实现。这些类可以通过继承QWidget或QDialog基类来实现。 3. 创建导航控制器 为了切换不同的界面,我们需要添加一个导航控制器,这个控制器可以用来管理每个界面对象并显示它们。在PyQt5中,我们可以通过创建一个QStackedWidget控制器对象来实现。 4. 显示需要切换的页面 在导航控制器中,我们可以使用addWidget()方法将所有需要切换的页面置入StackedWidget控件。然后我们可以通过setCurrentIndex()方法来切换不同的页面。 5. 实现页面切换逻辑 当我们需要切换页面时,可以通过设置导航控制器的当前页面索引来实现。例如,我们可以将页面切换事件连接到导航控制器的setCurrentIndex()方法上,以实现切换不同页面的功能。 6. 设计界面 最后,我们需要设计多个需要切换的界面页面,可以通过使用Qt Designer等GUI设计器来实现。 总之,基于Python和PyQt5实现不同窗口下多界面切换模板,需要创建多个页面类,设计多个界面页面,创建导航控制器并实现切换逻辑。通过以上实现步骤,我们可以快速实现一个可切换不同界面的GUI应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值