看下面图片
我想退格键时,把符号 ”●“ 销点,因为用户按退格键时,可能还要接着前一行继续再写,例如:
现在我要判断按退格键时前面有没有文字,是不是都是特殊字符和空格,或者控制字符,
以前写了很多的功能函数,感觉写不完,可能用字符串匹配可以,但是我很少用,令天突然
我想起写遍历函数的几篇文章,来了灵感,于是在字符串类中添加了一个函数:
/// <summary>
///
/// 如果所有字符满足funConditions,则返回 true
///
/// 函数原型:
/// bool funConditions(const T& ch) { }
/// 写法:
/// isAllrules( [](const T& ch)->bool{ return ? } );
/// </summary>
/// <typeparam name="funConditions"></typeparam>
/// <param name="fun"></param>
/// <returns></returns>
/// 创建时间: 2025-04-25 最后一次修改时间: 2025-04-25 已测试( 2025-04-25)
template<class funConditions>
bool isAllRules(funConditions fun) {
for (size_t i = 0; i < _nLength; ++i) {
if (!fun(_pData[i]))
return false;
}
return true;
}
然而在QTextEdit中的使用如下:
bool my_QTextEdit::default_do_keyPressEvent_KeyBackspace(QKeyEvent* event)
{
/*
auto s1 = m_currentLineText.getBook_序号标记();
auto s2 = m_currentLineText.GetBook_序号标记2();
auto s3 = m_currentLineText.getBook_特殊符号标记();
auto s4 = m_currentLineText.getBook_章节标记();
*/
//if(s1.length() == 0 && s2.length() == 0 && s2.length() == 0 && s3.length() == 0)
QTextEdit::keyPressEvent(event);
_string s = m_currentLineText.trim();
if (s.length() < 2) {
#ifdef _D_
//d.printInfo("m_currentLineText.trim() < 2", "bool my_QTextEdit::default_do_keyPressEvent_KeyBackspace(QKeyEvent * event)");
#endif
this->f_setCurrentCharFormat(m_headlineStyle.mainBody());
}else if(s.length() < 3) {
#ifdef _D_
//d.printInfo("m_currentLineText.trim() < 3", "bool my_QTextEdit::default_do_keyPressEvent_KeyBackspace(QKeyEvent * event)");
#endif
this->f_setCurrLineTextStyle(m_headlineStyle.mainBody());
}
bool bContainAnySpecial = false; //是否有特殊符号
//全部是特殊符号或者是空格或者是控制字符
if (m_currentLineText.isAllRules([&bContainAnySpecial,this](wchar_t& ch)->bool {
if (gs.c_isControl(ch)) return true; //控制字符
if (ch == ' ') return true; //空格
if (m_specificSymbol.indexOf(ch) != -1) { //特殊字符
ch = ' '; //用空格代替特殊符号
bContainAnySpecial = true;
return true;
}
return false;
}) && bContainAnySpecial)
{
g_setCurrentLineText(this, m_currentLineText + _t(" "));
}
return true;
}
这个函数很有技巧,很灵活:
编译器调用isAllRues时,先运行lambda表达式,而完成了lambda表达式之后,if语句中第二个参数bContainAnySpecial 也被设置了,还一个神奇的地方是,当查找到有特殊字符时,比如“●”,
会自动把 “●” 变成空格,即:
m_currentLineText = " ● " => " "
函数isAllRules扩展性很好:
例如,你可以不断写功能函数:
全是控制字符
_string s;
s.isAllRules([](wchar_t& c) {
if (::iscntrl(c))
return true;
});
全是数字,
全是空格
数字或空格
全是可打印字符
可打印字符或格
.......