tr字符串的梗
工作问题总结
声明:应用程序代码为前人所写,仅仅只是维护代码,暂且不论代码风格瑕疵。
结论:
使用tr“包”起来的字符串,可能会被翻译为不同的语言,此时,应用程序在不同语言环境下可能会表现BUG。
1.问题及源码追溯过程
// 应用程序调用函数1
void WinHelpManual::openFunction(QString func)
{
QWebPage *webPage = m_view_list.page();
QWebFrame *webFrame = webPage->frameAt(QPoint(, ));
QWebElement webElement = webFrame->documentElement();
webElement.evaluateJavaScript(func);
}
// 应用程序调用函数2
void WinHelpManual::openUrl()
{
QString Html = m_view_list.selectedHtml();
QString strUrlExp = "outline_[0-9]*.htm";
QRegExp urlRegExp(strUrlExp, Qt::CaseSensitive);
if (urlRegExp.indexIn(Html) != -)
{
QString strWebUrl = urlRegExp.cap(); // 匹配到的url
m_view_contents.setUrl(QUrl(m_path + strWebUrl));
}
}
// 应用程序调用函数3
bool WinHelpManual::event(QEvent *event)
{
if (event->type() == QEvent::KeyRelease)
{
QKeyEvent *ke = static_cast<QKeyEvent*> (event);
if (ke->modifiers() == PANEL_MODIFIER)
{
static int Ekey;
if (ke->key() == PANEL_BAR || ke->key() == PANEL_WAVE || ke->key() == PANEL_NUMERIC || ke->key() == PANEL_VECTOR || \
ke->key() == PANEL_MARK || ke->key() == PANEL_ITEM || ke->key() == PANEL_FORM || ke->key() == PANEL_USER || \
ke->key() == PANEL_VOLTRANGE_CLOCKWISE || ke->key() == PANEL_VOLTRANGE_ANTICLOCKWISE || ke->key() == PANEL_VOLTRANGE_AUTO\
|| ke->key() == PANEL_CURRRANGE_CLOCKWISE || ke->key() == PANEL_CURRRANGE_ANTICLOCKWISE || ke->key() == PANEL_CURRANGE_AUTO\
|| ke->key() == PANEL_EXT || ke->key() == PANEL_ACCURATE || ke->key() == PANEL_UTILITY || ke->key() == PANEL_MEASURRE\
|| ke->key() == PANEL_OTHERS || ke->key() == PANEL_SOURCE || ke->key() == PANEL_FILE || ke->key() == PANEL_INFO \
|| ke->key() == PANEL_IMAGESAVE || ke->key() == PANEL_HOLD || ke->key() == PANEL_SINGLE || ke->key() == PANEL_STROE \
|| ke->key() == PANEL_INTEG || ke->key() == PANEL_LOCALLOCK)
{
openFunction();
}
m_view_list.page()->findText("");//清除
switch (ke->key())
{
case PANEL_ESC:
case PANEL_HELP:
hide();
return true;
case PANEL_BAR:
{
Ekey = PANEL_BAR;
m_view_list.page()->findText(tr("Bar Graph Display(Bar)"));
}
break;
case PANEL_WAVE:
{
Ekey = PANEL_WAVE;
m_view_list.findText(tr("Waveform Display(WAVE)"));
}
break;
case PANEL_NUMERIC:
{
Ekey = PANEL_NUMERIC;
m_view_list.findText(tr("Numetic Data Display(NUMERIC)"));
}
break;
case PANEL_VECTOR:
Ekey = PANEL_VECTOR;
m_view_list.findText(tr("Vector Display(Vector)"));
break;
case PANEL_MARK:
{
switch (Ekey)
{
case PANEL_BAR:
m_view_list.findText(tr("Bar Display Mark (MARK)"));
break;
case PANEL_WAVE:
m_view_list.findText(tr("Waveform Display Mark(MARK)"));
break;
default:
break;
}
}
break;
case PANEL_ITEM:
{
switch (Ekey)
{
case PANEL_BAR:
m_view_list.findText(tr("Bar Display Item (ITEM)"));
break;
case PANEL_WAVE:
m_view_list.findText(tr("Waveform Display Item(ITEM)"));
break;
case PANEL_NUMERIC:
m_view_list.findText(tr("Numetic Display Item(ITEM)"));
break;
case PANEL_VECTOR:
m_view_list.findText(tr("Vector Display Item(ITEM)"));
break;
default:
break;
}
}
break;
case PANEL_FORM:
{
switch (Ekey)
{
case PANEL_BAR:
m_view_list.findText(tr("Bar Display Format(FORM)"));
break;
case PANEL_WAVE:
m_view_list.findText(tr("Waveform Display Format(FORM)"));
break;
case PANEL_NUMERIC:
m_view_list.findText(tr("Numetic Display Format(FORM)"));
break;
case PANEL_VECTOR:
m_view_list.findText(tr("Vector Display Format(FORM)"));
break;
default:
break;
}
}
break;
case PANEL_USER:
m_view_list.findText(tr("Numetic Data Display(NUMERIC)"));
break;
case PANEL_TAB:
if (m_view_contents.hasFocus())
{
m_view_contents.setFocusPolicy(Qt::NoFocus);
m_view_list.setFocus();
p_curWebView = &m_view_list;
repaint();
}
else if (m_view_list.hasFocus())
{
m_view_list.setFocusPolicy(Qt::NoFocus);
m_view_contents.setFocus();
p_curWebView = &m_view_contents;
repaint();
}
break;
case PANEL_VOLTRANGE_CLOCKWISE:
case PANEL_VOLTRANGE_ANTICLOCKWISE:
m_view_list.findText(tr("Voltage Range(RANGE UP/DOWN (V))"));
break;
case PANEL_VOLTRANGE_AUTO:
m_view_list.findText(tr("Auto Voltage Range(AUTO (V))"));
break;
case PANEL_CURRRANGE_CLOCKWISE:
case PANEL_CURRRANGE_ANTICLOCKWISE:
m_view_list.findText(tr("Current Range (RANGE UP/DOWN (A))"));
break;
case PANEL_CURRANGE_AUTO:
m_view_list.findText(tr("Auto Current Range(AUTO (A))"));
break;
case PANEL_EXT:
m_view_list.findText(tr("External Current Sensor Range (EXT SENSOR; option)"));
break;
case PANEL_ACCURATE:
m_view_list.findText(tr("Line Filter(LINE FILTER)"));
break;
case PANEL_UTILITY:
m_view_list.findText(tr("Utility (UTILITY)"));
break;
case PANEL_MEASURRE:
m_view_list.findText(tr("Computation(MEASURE)"));
break;
case PANEL_OTHERS:
m_view_list.findText(tr("Combination Display (COMBINE)"));
break;
case PANEL_SOURCE:
m_view_list.findText(tr("Measurement period(SYNC SOURCE)"));
break;
case PANEL_FILE:
m_view_list.findText(tr("File(File)"));
break;
case PANEL_INFO:
m_view_list.findText(tr(""));
break;
case PANEL_IMAGESAVE:
m_view_list.findText(tr("Screen capture function (Image )"));
break;
case PANEL_HOLD:
m_view_list.findText(tr("Holding Measured Values(HOLD)"));
break;
case PANEL_SINGLE:
m_view_list.findText(tr("Single Measurement(SINGLE)"));
break;
case PANEL_STROE:
m_view_list.findText(tr("Data Storage"));
break;
case PANEL_INTEG:
m_view_list.findText(tr("Integrated Power(Watt hours)"));
break;
case PANEL_LOCALLOCK:
m_view_list.findText(tr("Touch Unlock"));
break;
default:
return true;
}
openUrl();
}
}
return QWidget::event(event);
}
// QWebView page() 接口源码
QWebPage *QWebView::page() const
{
if (!d->page)
{
QWebView *that = const_cast<QWebView *>(this);
that->setPage(new QWebPage(that));
}
return d->page;
}
// QWebView findText() 接口源码
bool QWebView::findText(const QString &subString, QWebPage::FindFlags options)
{
if (d->page)
{
return d->page->findText(subString, options);
}
return false;
}
// QWebPage findText() 接口源码
bool QWebPage::findText(const QString &subString, FindFlags options)
{
return d->findText(subString, static_cast<QWebPageAdapter::FindFlag>(options.operator int()));
}
// QWebPagePrivate findText() 接口源码
bool QWebPageAdapter::findText(const QString& subString, FindFlag options)
{
::WebCore::FindOptions webCoreFindOptions = ; if (!(options & FindCaseSensitively))
{
webCoreFindOptions |= WebCore::CaseInsensitive;
} if (options & FindBackward)
{
webCoreFindOptions |= WebCore::Backwards;
} if (options & FindWrapsAroundDocument)
{
webCoreFindOptions |= WebCore::WrapAround;
} if (options & FindAtWordBeginningsOnly)
{
webCoreFindOptions |= WebCore::AtWordStarts;
} if (options & TreatMedialCapitalAsWordBeginning)
{
webCoreFindOptions |= WebCore::TreatMedialCapitalAsWordStart;
} if (options & FindBeginsInSelection)
{
webCoreFindOptions |= WebCore::StartInSelection;
} if (options & HighlightAllOccurrences)
{
if (subString.isEmpty())
{
page->unmarkAllTextMatches();
return true;
} return page->markAllMatchesForText(subString, webCoreFindOptions, /*shouldHighlight*/ true, /*limit*/ );
} if (subString.isEmpty())
{
page->mainFrame()->selection()->clear();
Frame* frame = page->mainFrame()->tree()->firstChild();
while (frame)
{
frame->selection()->clear();
frame = frame->tree()->traverseNextWithWrap(false);
}
} return page->findString(subString, webCoreFindOptions);
}
// Page findString() 接口源码
bool Page::findString(const String& target, FindOptions options)
{
if (target.isEmpty() || !mainFrame())
{
return false;
} bool shouldWrap = options & WrapAround; Frame* frame = focusController()->focusedOrMainFrame();
Frame* startFrame = frame;
do
{
if (frame->editor().findString(target, (options & ~WrapAround) | StartInSelection))
{
if (frame != startFrame)
{
startFrame->selection()->clear();
} focusController()->setFocusedFrame(frame);
return true;
}
frame = incrementFrame(frame, !(options & Backwards), shouldWrap);
} while (frame && frame != startFrame); // Search contents of startFrame, on the other side of the selection that we did earlier.
// We cheat a bit and just research with wrap on
if (shouldWrap && !startFrame->selection()->isNone())
{
bool found = startFrame->editor().findString(target, options | WrapAround | StartInSelection);
focusController()->setFocusedFrame(frame);
return found;
} return false;
}
// Page mainFrame() 成员方法源码
Frame* mainFrame() const { return m_mainFrame.get(); }
// Editor findString() 成员方法源码
bool Editor::findString(const String& target, FindOptions options)
{
VisibleSelection selection = m_frame->selection()->selection();
RefPtr<Range> resultRange = rangeOfString(target, selection.firstRange().get(), options);
if (!resultRange)
{
return false;
} m_frame->selection()->setSelection(VisibleSelection(resultRange.get(), DOWNSTREAM));
m_frame->selection()->revealSelection();
return true;
}
2.问题原因
tr翻译后导致字符串查找失败。
如上实例,因为tr“包”起来的字符串被翻译为不同语言,但是每次与之比较匹配的字符串始终为英语版本。
所以,总出现匹配失败的异常,导致调试排除浪费很长时间,在此特别备录。
Good Good Study, Day Day Up.
顺序 选择 循环 总结
tr字符串的梗的更多相关文章
- QT 随笔目录
[1]基础部分 <信号和槽机制> <信号与槽知识点> <QString 与 string转换> <QT 继承QWidget && 继承QDia ...
- python中字符串操作--截取,查找,替换
python中,对字符串的操作是最常见的,python对字符串操作有自己特殊的处理方式. 字符串的截取 python中对于字符串的索引是比较特别的,来感受一下: s = '123456789' #截取 ...
- 【linux】学习5
鸟哥那本书第11章的内容 管理整个计算机硬件的是操作系统的内核(kernel),内核是需要保护的,我们一般用户只能通过shell来跟内核通信.Shell是用户操作系统的接口 cat /etc/pas ...
- Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...
- lunx命令2
测试网络 ping 查看ip ifconfig 关闭防火墙 iptables -F 干掉nginx进程 killall nginx 切换用户 su linux下连接另一台linux服务区 ssh ro ...
- 12.QT4.7.4-解决WIN平台和Linux平台中文乱码,QLineEdit右击菜单中文显示
1.解决Win平台中文显示 1.1首先解决win平台上中文显示乱码问题 1)首先查看qt creator的编码格式 通过->编辑->选择编码 查看. 2)如果qt creator的编码格式 ...
- 20190320 Dojo常用方法总结
0. 使用环境 Dojo版本:1.14.2 此次总结以dojo的base为主,即不需要手动引入组件 1. 常用不归类方法 1.1. dojo.addOnLoad 在页面加载完成并且dojo.requi ...
- C/C++ -- Gui编程 -- Qt库的使用 -- Qt5试用
1.头文件<QtGui>变成了<QtWidgets> 相应<QtGui/***>变成了<QtWidgets/***> 2.QTextCodec::set ...
- 如何用javasript对Gridview的项目进行汇总统计?
当我们在gridview显示统计信息时,都会想在gridview最后一行显示[小计]结果,但gridview的话好像比较难搞(至少我也不会呀 囧~),那么我就结合jquery写了一个解决方案,下面举个 ...
随机推荐
- <<Sklearn 与 TensorFlow 机器学习实用指南>>
地址 https://github.com/apachecn/hands-on-ml-zh 目录结构 零.前言 第一部分 机器学习基础 一.机器学习概览 二.一个完整的机器学习项目 三.分类 四.训练 ...
- 10.4-uC/OS-III内部任务(空闲任务OS_IdleTask())
1.内部任务-空闲任务 在uC/OS-III初始化的时候,它会创建至少2个内部的任务(OS_IdleTask()和OS_TickTask()), 3个可选择的任务 ( OS_StatTask(),OS ...
- (1.15)mysql锁问题之InnoDB锁
关键词:innodb锁,mysql锁 概要: 1.事务的隔离级别 2.InnoDB锁争用 3.innodb锁 [3.1]innodb的行锁模式及加锁方法 其实,默认情况下,mysql 的 select ...
- dedecms清空所有文章怎么操作?sql语句如何写?
小C新建了一个站,确切的说是复制,出于seo考虑,决定清空所有文章,那么dedecms清空所有文章怎么操作?sql语句如何写呢?特别提醒:修改之前一定要先做好备份,以防万一!下面的语句在迫不得已的情况 ...
- 网络传输--TCP
TCP网络编程 一.TCP简介 二.TCP网络程序--客户端 三.TCP网络程序--服务端 四.TCP知识总结 五.文件下载案例 六.3次握手和4次挥手 回到顶部 一.TCP简介TCP 1.TCP的简 ...
- 主成分分析(PCA)原理详解
一.PCA简介 1. 相关背景 在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行分析寻找规律.多变量大样本无疑会为研究和应用提供了丰富的信息,但也在一定程度上 ...
- Dell服务器Raid5之后安装系统
在做raid之后,安装系统.竟然安装不成功! 百度之后,发现第一启动项是raid的硬盘,不是我本机的ssd. 报错如下: 启动机器F2—boot setting 如果引导模式是UEFI 换成了bios ...
- sort(排序) qsort(快排) bsearch(二分查找)
sort: 一.对int类型数组排序 int a[100]; int cmp ( int a , int b ) //不必强制转换 { return a < b;//升序排列. } sort ( ...
- Centos7系统防火墙上开端口
//permanent 永久生效 没有此参数重启失效 firewall -cmd --zone=public --add -port=80/tcp --permanent //开 ...
- [Guitar self-practising] 【吉他练习王-节奏练习】曲目1 基本扫弦节奏练习
这本书来自吉他练习王-节奏练习, 大家可以自行到网上搜搜电子版看看. 扫弦练习: 将左手轻轻靠着琴弦, mute琴弦.右手拿上拨片, 节拍器60,左脚踏着节拍练习. note: 注意 “轻”(幅度轻, ...