【问题标题】:QTranslator on default context menu for QTextEditQTextEdit 的默认上下文菜单上的 QTranslator
【发布时间】:2013-06-23 13:06:17
【问题描述】:

我在 PyQt5 中使用 site-packages/PyQt5/translations 文件夹中的 qt_xx.qm 翻译 QTextEdit、QPlainTextEdit 和 QTextBrowser 的默认上下文菜单时遇到问题。例如,它适用于 QLineEdit(这是相同的上下文菜单)。如何处理?

重现问题的代码:

# coding: utf-8

import sys

from PyQt5.QtCore import QLocale
from PyQt5.QtCore import QTranslator
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QTextEdit
from PyQt5.QtWidgets import QVBoxLayout


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        widget = QWidget()

        lineEdit = QLineEdit()
        textEdit = QTextEdit()

        vbox = QVBoxLayout(widget)
        vbox.addWidget(lineEdit)
        vbox.addWidget(textEdit)

        self.setCentralWidget(widget)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    locale = QLocale.system().name()

    qtTranslator = QTranslator()
    if qtTranslator.load('C:/Python33/Lib/site-packages/PyQt5/translations/qt_' + locale):
        app.installTranslator(qtTranslator)

    mainWindow = MainWindow()
    mainWindow.show()
    app.exec_()

【问题讨论】:

    标签: python pyqt qt5 pyqt5


    【解决方案1】:

    我遇到了同样的问题,我尝试通过修改调用方法QTextEdit::createStandardContext创建的标准上下文菜单来解决问题,它确实有效。
    代码如下:

    void CWQTextEdit::contextMenuEvent(QContextMenuEvent *e)
    {
        QMenu *menu = QTextEdit::createStandardContextMenu();
        if (menu == NULL)
            return QTextEdit::contextMenuEvent(e);
    
        QList<QAction*> actions = menu->actions();
    
        foreach (QAction *action, actions)
        {
           QString actionText = action->text();
           if (actionText.contains("Undo"))
           {
               actionText.replace("Undo", tr("Undo"));
               action->setText(actionText);
           }
           else if (actionText.contains("Redo"))
           {
               actionText.replace("Redo", tr("Redo"));
               action->setText(actionText);
           }
           else if (actionText.contains("Cu&t"))
           {
               actionText.replace("Cu&t", tr("Cut"));
               action->setText(actionText);
           }
           else if (actionText.contains("Copy"))
           {
               actionText.replace("Copy", tr("Copy"));
               action->setText(actionText);
           }
           else if (actionText.contains("Paste"))
           {
               actionText.replace("Paste", tr("Paste"));
               action->setText(actionText);
           }
           else if (actionText.contains("Delete"))
           {
               actionText.replace("Delete", tr("Delete"));
               action->setText(actionText);
           }
           else if (actionText.contains("Select All"))
           {
               actionText.replace("Select All", tr("Select All"));
               action->setText(actionText);
           }
        }
    
        menu->exec(e->globalPos());
    }
    

    【讨论】:

      【解决方案2】:
      if __name__ == "__main__":
          app = QApplication(argv)
          translator = QtCore.QTranslator()
          translator.load("translations/qt_zh_CN.qm")
          app.installTranslator(translator)
      

      【讨论】:

      • 嗨,欢迎来到 Stack Overflow!尽量不要只是转储代码,并详细说明您的答案:为什么会这样?为什么这是更好的解决方案?
      猜你喜欢
      • 2012-05-06
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      相关资源
      最近更新 更多