解决QT中文5.6 QTextEdit QPlainTextEdit的右键菜单翻译不全

原因:

QT项目中,发现QTextEdit QPlainTextEdit的右键菜单翻译不全,跟踪代码发现是未翻译qtbase.ts的QWidgetTextControl节点,且未见有qtbase_CN.ts版本。

然后就以日文版的qtbase_ja.ts为模板,把QWidgetTextControl节点翻译到qt_zh_CN.ts中,在编译为二进制用于项目中。


注意:u"###5 Translate  escape character." 这个模块的功能是还原xml节点的text含' "时,在编程xml时会被转义为"&;"的问题。


用法:

call merge_translate.py "\src\qtbase_ja.ts" "\src\qt_zh_CN_.ts" "\src\qt_zh_CN.ts"


代码:

#coding=utf-8  

from bs4 import BeautifulSoup
import lxml
import re
import os,sys


'''
<context>
<name>CloseButton</name>
<message>
<source>Close Tab</source>
<translation>xxxxxxxxxxxxxxxxxxx</translation>
</message>
</context>
'''

def doTranslate(pathJa, pathCNTemp, pathCN):    
    print pathJa, pathCNTemp, pathCN
    #os.system("pause")    
    
    print u"###1 read Translation file."
    contentsJA= ""
    with open(pathJa) as f:
        for line in f.readlines():
            contentsJA += line
    soupJA = BeautifulSoup(contentsJA, "xml")
    

    print u"###2 get Translation node."
    listContents = [ item for item in soupJA.find_all('context') if item('name')[0].contents[0] == u'QWidgetTextControl']

    if 0 == len(listContents):
        print u" QWidgetTextControl not exist,return"
        return

    #清空原来的翻译内容
    QWidgetTextControlContents = listContents[0]
    for item in listContents[0].findChildren('message'):
        item('translation')[0].contents[0]=u''
        

    print u"###3 insert Translation node."
    contentsCN= ""
    with open(pathCNTemp) as f:
        for line in f.readlines():
            contentsCN += line
    soupCN = BeautifulSoup(contentsCN, "xml")

    listContentsCN = [ item for item in soupCN.find_all('context') if item('name')[0].contents[0] == u'QWidgetTextControl']
    
    if 0 == len(listContentsCN):
        lastContents = soupCN.find_all('context')[-1]
        lastContents.insert_after(QWidgetTextControlContents)        


    print u"###4 Translate null  word entry."
    for item in soupCN.find_all('context')[-1].findChildren('message'):
        if 0 == len(item.translation.contents[0]):
            listTemp = [train for train in soupCN.find_all('message') if item.source.contents[0] == train.source.contents[0] and  0 != len(train.translation.contents[0])]
            #print listTemp
            if len(listTemp) > 0:
                temp = listTemp[0]
                item.translation.contents[0] = temp.translation.contents[0]



    print u"###5 Translate  escape character."
    t =  str(soupCN)
    while re.findall( r"(>.*?)'", t ):
        t = re.sub(r"(>.*?)'", r"\1'", t)    

    while re.findall( '''(>.*?)\"''', t ):
        t = re.sub('''(>.*?)\"''', r"\1"", t)
    
    print u"###6 save file."
    fo = open(pathCN, "w+")
    fo.write( t)
    fo.close()


    
if __name__ == "__main__":    
    #print sys.argv
    print sys.getdefaultencoding()
    if 4 > len(sys.argv):
        print u"please input qtbase_ja.ts  qt_zh_CN_.ts  qt_zh_CN.ts full path."
    else:
        doTranslate(sys.argv[1], sys.argv[2], sys.argv[3])
    



    


Qt C++中,你可以通过设置`QTextEdit`的上下文菜单来定制其右键菜单。下面是一个简单的步骤说明: 1. **创建QContextMenuPlugin**: 首先,你需要创建一个`QContextMenuPlugin`类来管理自定义的菜单。在这个类中,你需要定义菜单项目及其对应的槽函数。 ```cpp class MyContextPlugin : public QAbstractContextMenuPlugin { public: MyContextPlugin(QObject *parent = nullptr) : QAbstractContextMenuPlugin(parent) {} void createMenu(QMenu *menu, const QPoint &pos) override { QAction *copyAction = menu->addAction(tr("复制")); copyAction->setData(pos); connect(copyAction, &QAction::triggered, this, &MyContextPlugin::copyText); // 可能还需要其他菜单项,如粘贴、剪切等 // ... } private slots: void copyText() { QTextCursor cursor(textEdit->textCursor()); QApplication::clipboard()->setText(cursor.selectedText()); } // 其他槽函数和所需的文本编辑器实例 textEdit; }; ``` 2. **注册并应用到QTextEdit**: 在你的应用程序或`QTextEdit`的初始化阶段,注册`QContextMenuPlugin`并将其绑定到`QTextEdit`: ```cpp // 注册contextMenu插件 QApplication::instance()->addPlugin(new MyContextPlugin); // 在QTextEdit的构造函数中设置上下文菜单 QTextEdit *textEdit = new QTextEdit(parentWidget); textEdit->setContextMenuPolicy(Qt::ActionsContextMenu); // 或者如果你已经在运行时想要更改 textEdit->installEventFilter(new ContextMenuEventFilter(textEdit)); ``` 3. **创建ContextMenuEventFilter**: 创建一个事件过滤器,用于检测鼠标右键点击事件并显示自定义菜单: ```cpp class ContextMenuEventFilter : public QObject { Q_OBJECT public: explicit ContextMenuEventFilter(QWidget *parent) : QObject(parent) {} ~ContextMenuEventFilter() {} protected: bool eventFilter(QObject *obj, QEvent *event) override { if (event->type() == QEvent::MouseButtonPress && obj == textEdit) { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); if (mouseEvent->button() == Qt::RightButton) { QMenu *menu = textEdit->createStandardContextMenu(); menu->insertAction(menu->actions()[0], myContextMenuPlugin.createMenu(menu, mouseEvent->globalPos())); menu->exec(mouseEvent->globalPos()); return true; // 吃掉事件,防止默认的右键菜单显示 } } return QObject::eventFilter(obj, event); } private: MyContextPlugin *myContextMenuPlugin; }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值