PyQt、PySide使用QMessageBox的时候会发现按钮都是英文的,对于中文的应用软件来说会降低使用体验。本文将以问答对话框为例,介绍如何设置中文按钮,以及如何使用。
实验环境
本文实验环境为:Windows 10,Python 3.8,PySide==6.5.0。其他版本的PySide或PyQt也可以使用类似的方法进行设置和使用。
问答(Question)
如下代码定义了一个汉化后问答对话框的类,默认Yes按钮显示“是”,No按钮显示“否”。可以通过yes_button_set_text
和no_button_set_text
方法来覆盖默认的Yes、No按钮显示。
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QMessageBoxclass QuestionMsgBox(QMessageBox):def __init__(self, title, text):super().__init__()self.setWindowModality(Qt.WindowModality.ApplicationModal)self.setWindowTitle(title)self.setIcon(QMessageBox.Icon.Question)self.setText(text)self.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)self.yes_button = self.button(QMessageBox.StandardButton.Yes)self.no_button = self.button(QMessageBox.StandardButton.No)self.yes_button.setText('是') # 默认Yes按钮为“是”self.no_button.setText('否') # 默认No按钮为“否”def yes_button_set_text(self, text):self.yes_button.setText(text)def no_button_set_text(self, text):self.no_button.setText(text)
单独测试
接下来将单独测试问答对话框,代码如下所示。
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QMessageBoxclass QuestionMsgBox(QMessageBox):def __init__(self, title, text):super().__init__()self.setWindowModality(Qt.WindowModality.ApplicationModal)self.setIcon(QMessageBox.Icon.Question)self.setWindowTitle(title)self.setText(text)self.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)self.yes_button = self.button(QMessageBox.StandardButton.Yes)self.no_button = self.button(QMessageBox.StandardButton.No)self.yes_button.setText('是')self.no_button.setText('否')def yes_button_set_text(self, text):self.yes_button.setText(text)def no_button_set_text(self, text):self.no_button.setText(text)def yes_func():print('Pressed yes button')def no_func():print('Pressed no button')def main():app = QApplication([])msg_box = QuestionMsgBox('标题', '确认内容?')msg_box.yes_button.clicked.connect(yes_func)msg_box.no_button.clicked.connect(no_func)msg_box.show()app.exec()if __name__ == '__main__':main()
程序运行后,显示如图1所示问答对话框。单击“是”,将运行yes_func()
函数;单击“否”,将运行no_func()
函数。
需要注意的是:在单独测试对话框的时候,main()
函数中需使用msg_box.show()
方法来显示对话框,而不能使用msg_box.exec()
方法。否则,程序将无法结束,需强行关闭程序。
应用测试
最后是在应用中测试问答对话框,代码如下所示。
from PySide6.QtCore import Qt
from PySide6.QtGui import QScreen, QFont
from PySide6.QtWidgets import QApplication, QMessageBox, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QLineEditclass QuestionMsgBox(QMessageBox):def __init__(self, title, text):super().__init__()self.setWindowModality(Qt.WindowModality.ApplicationModal)self.setIcon(QMessageBox.Icon.Question)self.setWindowTitle(title)self.setText(text)self.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)self.yes_button = self.button(QMessageBox.StandardButton.Yes)self.no_button = self.button(QMessageBox.StandardButton.No)self.yes_button.setText('是')self.no_button.setText('否')def yes_button_set_text(self, text):self.yes_button.setText(text)def no_button_set_text(self, text):self.no_button.setText(text)class AppGUI(QWidget):def __init__(self):super().__init__()# set windowself.setWindowTitle('应用窗口')win_width = 290win_height = 80self.setFixedWidth(win_width)self.setFixedHeight(win_height)screen_size = QScreen.availableGeometry(QApplication.primaryScreen())win_x = (screen_size.width() - win_width) / 2win_y = (screen_size.height() - win_height) / 2self.move(win_x, win_y)self.setFont(QFont('Microsoft YaHei UI', 12))# set layoutself.win_layout = QVBoxLayout()self.main_layout = QHBoxLayout()self.setLayout(self.win_layout)# widgetself.open_button = QPushButton('打开问答对话框')self.open_button.clicked.connect(self.open_question_msg_box)self.win_layout.addWidget(self.open_button)self.win_layout.addLayout(self.main_layout)self.label = QLabel('单击的按钮:')self.main_layout.addWidget(self.label)self.entry = QLineEdit()self.main_layout.addWidget(self.entry)def open_question_msg_box(self):msg_box = QuestionMsgBox('标题', f'确认内容?')msg_box.yes_button.clicked.connect(self.yes_func)msg_box.no_button.clicked.connect(self.no_func)msg_box.exec()def yes_func(self):self.entry.setText('是')def no_func(self):self.entry.setText('否')def main():app = QApplication([])app_gui = AppGUI()app_gui.show()app.exec()if __name__ == '__main__':main()
程序运行后,打开如图2所示界面。单击“打开问答对话框”,打开如图1所示问答对话框,单击问答对话框的按钮后,将会将所单击的按钮文本打印在输入框中。若单击“是”,则如图3所示;若单击“否”,则如图4所示。
需要注意的是:在应用测试中使用对话框的时候,AppGUI
类中的open_question_msg_box
方法需使用msg_box.exec()
方法,而不能使用msg_box.show()
方法。否则,对话框将会一闪而过。
联系我
如有疑问,邮件是最快联系我的方式:wm_chen@yeah.net