本文整理汇总了C++中QChar::unicode方法的典型用法代码示例。如果您正苦于以下问题:C++ QChar::unicode方法的具体用法?C++ QChar::unicode怎么用?C++ QChar::unicode使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QChar
的用法示例。
在下文中一共展示了QChar::unicode方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Chunk
static Chunk *parseInternal(Chunk *ctail, const QString& txt, uint& start, uint cnt, bool interpretNewLine) {
Chunk *chead = ctail;
if (ctail->group) {
ctail = new Chunk(ctail, Chunk::None, false, true);
}
for (uint& i = start; i < cnt; ++i) {
QChar c = txt[i];
Chunk::VOffset dir = Chunk::Down;
switch (c.unicode()) {
case '\n':
if (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) {
while (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) {
ctail = ctail->prev;
}
ctail = new Chunk(ctail, Chunk::None, false, true);
}
if (!ctail->text.isEmpty() || ctail->locked()) {
if (ctail->vOffset != Chunk::None) {
ctail = new Chunk(ctail->prev, Chunk::None, false, true);
} else {
ctail = new Chunk(ctail, Chunk::None, false, true);
}
}
ctail->linebreak = true;
ctail = new Chunk(ctail, Chunk::None, false, true);
break;
case '\t':
if (!ctail->text.isEmpty() || ctail->locked()) {
if (ctail->vOffset != Chunk::None) {
ctail = new Chunk(ctail->prev, Chunk::None, false, true);
} else {
ctail = new Chunk(ctail, Chunk::None, false, true);
}
}
ctail->tab = true;
ctail = new Chunk(ctail, Chunk::None, false, true);
break;
case 0x5c: // \ /**/
if (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) {
while (ctail->vOffset != Chunk::None && (!ctail->text.isEmpty() || ctail->locked())) {
ctail = ctail->prev;
}
ctail = new Chunk(ctail, Chunk::None, false, true);
}
if (ctail->vOffset != Chunk::None && !ctail->text.isEmpty()) {
ctail = new Chunk(ctail->prev, Chunk::None, false, true);
}
++i;
if (i == cnt) {
setNormalChar('\\', &ctail);
} else {
int skip = 0;
if (!parseOutChar(txt, i, &skip, &ctail, interpretNewLine)) {
setNormalChar(txt[i], &ctail);
} else {
i += skip - 1;
}
}
break;
case 0x5e: // ^
dir = Chunk::Up;
case 0x5f: // _ (dir is set to Down at beginning of loop)
if (ctail->text.isEmpty() && !ctail->group) {
setNormalChar(c, &ctail);
} else {
if (ctail->vOffset != Chunk::None) {
if (ctail->vOffset != dir) {
ctail = new Chunk(ctail->prev, dir, false, true);
} else if (ctail->group) {
ctail = new Chunk(ctail, dir, false, true);
} else {
ctail = new Chunk(ctail, dir, false, true);
}
} else {
ctail = new Chunk(ctail, dir, false, true);
}
}
break;
case 0x7b: // {
if (ctail->text.isEmpty() && !ctail->group) {
bool rc = false;
new Chunk(ctail, Chunk::None, true, true);
dumpattr(ctail->group, "start group with non-group and empty text");
rc = 0L != parseInternal(ctail->group, txt, ++i, cnt, interpretNewLine);
assert(rc);
dumpattr(ctail->group, "after start group with non-group and empty text");
if (!rc) {
return 0L;
}
} else {
bool rc = false;
if (ctail->vOffset == Chunk::None) {
rc = 0L != parseInternal(new Chunk(ctail, Chunk::None, true, true), txt, ++i, cnt, interpretNewLine);
} else {
rc = 0L != parseInternal(new Chunk(ctail->prev, Chunk::None, true, true), txt, ++i, cnt, interpretNewLine);
}
//.........这里部分代码省略.........
示例2: validate
QValidator::State NexusAddressValidator::validate(QString &input, int &pos) const
{
// Correction
for(int idx=0; idx<input.size();)
{
bool removeChar = false;
QChar ch = input.at(idx);
// Transform characters that are visually close
switch(ch.unicode())
{
case 'l':
case 'I':
input[idx] = QChar('1');
break;
case '0':
case 'O':
input[idx] = QChar('o');
break;
// Qt categorizes these as "Other_Format" not "Separator_Space"
case 0x200B: // ZERO WIDTH SPACE
case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE
removeChar = true;
break;
default:
break;
}
// Remove whitespace
if(ch.isSpace())
removeChar = true;
// To next character
if(removeChar)
input.remove(idx, 1);
else
++idx;
}
// Validation
QValidator::State state = QValidator::Acceptable;
for(int idx=0; idx<input.size(); ++idx)
{
int ch = input.at(idx).unicode();
if(((ch >= '0' && ch<='9') ||
(ch >= 'a' && ch<='z') ||
(ch >= 'A' && ch<='Z')) &&
ch != 'l' && ch != 'I' && ch != '0' && ch != 'O')
{
// Alphanumeric and not a 'forbidden' character
}
else
{
state = QValidator::Invalid;
}
}
// Empty address is "intermediate" input
if(input.isEmpty())
{
state = QValidator::Intermediate;
}
return state;
}
示例3: text
void RTFGenParser::text(const QString &text)
{
if (m_res_size)
return;
unsigned size = res.length();
if (size > m_max_size){
textPos = start_pos;
m_res_size = size;
return;
}
for (int i = 0; i < (int)(text.length()); i++){
QChar c = text[i];
if (c.isSpace()){
unsigned size = res.length();
if (size > m_max_size){
textPos = start_pos + i;
m_res_size = size;
return;
}
}
// In Qt, unless you force the paragraph direction with (Left/Right)
// Ctrl-Shift (also known as Key_Direction_L and Key_Direction_R),
// the P tag won't have a DIR attribute at all. In such cases, unlike
// HTML, Qt will render the paragraph LTR or RTL according to the
// first strong character (as Unicode TR#9 defines). Thus, if the
// direction isn't known yet, we check each character till we find
// a strong one.
if ((m_lastParagraphPos != 0) && (m_paragraphDir == DirUnknown))
{
switch(c.direction())
{
case QChar::DirL:
res.insert(m_lastParagraphPos, "\\ltrpar");
m_paragraphDir = DirLTR;
break;
case QChar::DirR:
res.insert(m_lastParagraphPos, "\\rtlpar");
m_paragraphDir = DirRTL;
break;
default: // to avoid warnings
break;
}
}
unsigned short u = c.unicode();
if (c == '\r' || c == '\n')
continue;
if ((c == '{') || (c == '}') || (c == '\\')){
char b[5];
snprintf(b, sizeof(b), "\\\'%02x", u & 0xFF);
res += b;
m_bSpace = false;
continue;
}
if (u < 0x80){
if (m_bSpace)
res += ' ';
res += (char)u;
m_bSpace = false;
continue;
}
QString s;
s += c;
if (m_codec){
string plain;
plain = static_cast<string>(m_codec->fromUnicode(s));
if ((plain.length() == 1) && (m_codec->toUnicode(plain.c_str()) == s)){
char b[5];
snprintf(b, sizeof(b), "\\\'%02x", plain[0] & 0xFF);
res += b;
m_bSpace = false;
continue;
}
}
res += "\\u";
res += number(s[0].unicode());
res += "?";
m_bSpace = false;
}
}
示例4: parsePathDataFast
bool QQuickSvgParser::parsePathDataFast(const QString &dataStr, QPainterPath &path)
{
qreal x0 = 0, y0 = 0; // starting point
qreal x = 0, y = 0; // current point
char lastMode = 0;
QPointF ctrlPt;
const QChar *str = dataStr.constData();
const QChar *end = str + dataStr.size();
while (str != end) {
while (str->isSpace())
++str;
QChar pathElem = *str;
++str;
QChar endc = *end;
*const_cast<QChar *>(end) = 0; // parseNumbersArray requires 0-termination that QStringRef cannot guarantee
QVarLengthArray<qreal, 8> arg;
parseNumbersArray(str, arg);
*const_cast<QChar *>(end) = endc;
if (pathElem == QLatin1Char('z') || pathElem == QLatin1Char('Z'))
arg.append(0);//dummy
const qreal *num = arg.constData();
int count = arg.count();
while (count > 0) {
qreal offsetX = x; // correction offsets
qreal offsetY = y; // for relative commands
switch (pathElem.unicode()) {
case 'm': {
if (count < 2) {
num++;
count--;
break;
}
x = x0 = num[0] + offsetX;
y = y0 = num[1] + offsetY;
num += 2;
count -= 2;
path.moveTo(x0, y0);
// As per 1.2 spec 8.3.2 The "moveto" commands
// If a 'moveto' is followed by multiple pairs of coordinates without explicit commands,
// the subsequent pairs shall be treated as implicit 'lineto' commands.
pathElem = QLatin1Char('l');
}
break;
case 'M': {
if (count < 2) {
num++;
count--;
break;
}
x = x0 = num[0];
y = y0 = num[1];
num += 2;
count -= 2;
path.moveTo(x0, y0);
// As per 1.2 spec 8.3.2 The "moveto" commands
// If a 'moveto' is followed by multiple pairs of coordinates without explicit commands,
// the subsequent pairs shall be treated as implicit 'lineto' commands.
pathElem = QLatin1Char('L');
}
break;
case 'z':
case 'Z': {
x = x0;
y = y0;
count--; // skip dummy
num++;
path.closeSubpath();
}
break;
case 'l': {
if (count < 2) {
num++;
count--;
break;
}
x = num[0] + offsetX;
y = num[1] + offsetY;
num += 2;
count -= 2;
path.lineTo(x, y);
}
break;
case 'L': {
if (count < 2) {
num++;
count--;
break;
}
x = num[0];
y = num[1];
num += 2;
count -= 2;
path.lineTo(x, y);
}
break;
case 'h': {
//.........这里部分代码省略.........
示例5: write
void gtAction::write(const QString& text, gtStyle *style)
{
if (isFirstWrite)
{
if (!doAppend)
{
if (it->nextInChain() != 0)
{
PageItem *nextItem = it->nextInChain();
while (nextItem != 0)
{
nextItem->itemText.clear();
nextItem = nextItem->nextInChain();
}
}
it->itemText.clear();
}
}
int paragraphStyle = -1;
if (style->target() == "paragraph")
{
gtParagraphStyle* pstyle = dynamic_cast<gtParagraphStyle*>(style);
assert(pstyle != NULL);
paragraphStyle = applyParagraphStyle(pstyle);
if (isFirstWrite)
inPara = true;
}
else if (style->target() == "frame")
{
gtFrameStyle* fstyle = dynamic_cast<gtFrameStyle*>(style);
assert(fstyle != NULL);
applyFrameStyle(fstyle);
}
if ((inPara) && (!lastCharWasLineChange) && (text.left(1) != "\n") && (lastParagraphStyle != -1))
paragraphStyle = lastParagraphStyle;
if (paragraphStyle == -1)
paragraphStyle = 0; //::findParagraphStyle(textFrame->doc(), textFrame->doc()->currentStyle);
const ParagraphStyle& paraStyle = textFrame->doc()->paragraphStyles()[paragraphStyle];
gtFont* font = style->getFont();
QString fontName = validateFont(font).scName();
CharStyle lastStyle, newStyle;
int lastStyleStart = 0;
if ((inPara) && (!overridePStyleFont))
{
if (paraStyle.charStyle().font().isNone())
{
gtFont font2(*font);
font2.setName(paraStyle.charStyle().font().scName());
QString fontName2 = validateFont(&font2).scName();
newStyle.setFont((*textFrame->doc()->AllFonts)[fontName2]);
}
}
else
{
setCharStyleAttributes(font, newStyle);
}
/*newStyle.eraseCharStyle(paraStyle.charStyle());*/
lastStyle = newStyle;
lastStyleStart = it->itemText.length();
QChar ch0(0), ch5(5), ch10(10), ch13(13);
for (int a = 0; a < text.length(); ++a)
{
if ((text.at(a) == ch0) || (text.at(a) == ch13))
continue;
QChar ch = text.at(a);
if ((ch == ch10) || (ch == ch5))
ch = ch13;
else if (ch.unicode() == 0x2028)
ch = SpecialChars::LINEBREAK;
else if (ch.unicode() == 0x2029)
ch = SpecialChars::PARSEP;
int pos = it->itemText.length();
it->itemText.insertChars(pos, QString(ch));
if (ch == SpecialChars::PARSEP)
{
if (paraStyle.hasName())
{
ParagraphStyle pstyle;
pstyle.setParent(paraStyle.name());
it->itemText.applyStyle(pos, pstyle);
}
else
it->itemText.applyStyle(pos, paraStyle);
}
}
it->itemText.applyCharStyle(lastStyleStart, it->itemText.length()-lastStyleStart, lastStyle);
if (paraStyle.hasName())
{
ParagraphStyle pStyle;
pStyle.setParent(paraStyle.name());
it->itemText.applyStyle(qMax(0,it->itemText.length()-1), pStyle);
}
//.........这里部分代码省略.........
示例6: scanToken
int Lexer::scanToken()
{
if (_stackToken != -1) {
int tk = _stackToken;
_stackToken = -1;
return tk;
}
_terminator = false;
again:
_validTokenText = false;
_tokenLinePtr = _lastLinePtr;
while (_char.isSpace()) {
if (unsigned sequenceLength = isLineTerminatorSequence()) {
_tokenLinePtr = _codePtr + sequenceLength - 1;
if (_restrictedKeyword) {
// automatic semicolon insertion
_tokenLine = _currentLineNumber;
_tokenStartPtr = _codePtr - 1;
return T_SEMICOLON;
} else {
_terminator = true;
syncProhibitAutomaticSemicolon();
}
}
scanChar();
}
_tokenStartPtr = _codePtr - 1;
_tokenLine = _currentLineNumber;
if (_codePtr > _endPtr)
return EOF_SYMBOL;
const QChar ch = _char;
scanChar();
switch (ch.unicode()) {
case '~': return T_TILDE;
case '}': return T_RBRACE;
case '|':
if (_char == QLatin1Char('|')) {
scanChar();
return T_OR_OR;
} else if (_char == QLatin1Char('=')) {
scanChar();
return T_OR_EQ;
}
return T_OR;
case '{': return T_LBRACE;
case '^':
if (_char == QLatin1Char('=')) {
scanChar();
return T_XOR_EQ;
}
return T_XOR;
case ']': return T_RBRACKET;
case '[': return T_LBRACKET;
case '?': return T_QUESTION;
case '>':
if (_char == QLatin1Char('>')) {
scanChar();
if (_char == QLatin1Char('>')) {
scanChar();
if (_char == QLatin1Char('=')) {
scanChar();
return T_GT_GT_GT_EQ;
}
return T_GT_GT_GT;
} else if (_char == QLatin1Char('=')) {
scanChar();
return T_GT_GT_EQ;
}
return T_GT_GT;
} else if (_char == QLatin1Char('=')) {
scanChar();
return T_GE;
}
return T_GT;
case '=':
if (_char == QLatin1Char('=')) {
scanChar();
if (_char == QLatin1Char('=')) {
scanChar();
return T_EQ_EQ_EQ;
}
return T_EQ_EQ;
}
return T_EQ;
//.........这里部分代码省略.........
示例7: QChar
static inline QChar convertUnicode(QChar c1, QChar c2, QChar c3, QChar c4)
{
return QChar((convertHex(c3.unicode()) << 4) + convertHex(c4.unicode()),
(convertHex(c1.unicode()) << 4) + convertHex(c2.unicode()));
}
示例8: matchBracelessControlStatement
/*
Returns \c true if the current line (and upwards) forms a braceless
control statement; otherwise returns \c false.
The first line of the following example is a "braceless control
statement":
if ( x )
y;
*/
static bool matchBracelessControlStatement()
{
int delimDepth = 0;
if ( yyLine->endsWith("else") )
return true;
if ( !yyLine->endsWith(QLatin1Char(')')) )
return false;
for ( int i = 0; i < SmallRoof; i++ ) {
int j = yyLine->length();
while ( j > 0 ) {
j--;
QChar ch = (*yyLine)[j];
switch ( ch.unicode() ) {
case ')':
delimDepth++;
break;
case '(':
delimDepth--;
if ( delimDepth == 0 ) {
if ( yyLine->indexOf(*iflikeKeyword) != -1 ) {
/*
We have
if ( x )
y
"if ( x )" is not part of the statement
"y".
*/
return true;
}
}
if ( delimDepth == -1 ) {
/*
We have
if ( (1 +
2)
and not
if ( 1 +
2 )
*/
return false;
}
break;
case '{':
case '}':
case ';':
/*
We met a statement separator, but not where we
expected it. What follows is probably a weird
continuation line. Be careful with ';' in for,
though.
*/
if ( ch != QChar(';') || delimDepth == 0 )
return false;
}
}
if ( !readLine() )
break;
}
return false;
}
示例9: writeBlock
void QTextOdfWriter::writeBlock(QXmlStreamWriter &writer, const QTextBlock &block)
{
if (block.textList()) { // its a list-item
const int listLevel = block.textList()->format().indent();
if (m_listStack.isEmpty() || m_listStack.top() != block.textList()) {
// not the same list we were in.
while (m_listStack.count() >= listLevel && !m_listStack.isEmpty() && m_listStack.top() != block.textList() ) { // we need to close tags
m_listStack.pop();
writer.writeEndElement(); // list
if (m_listStack.count())
writer.writeEndElement(); // list-item
}
while (m_listStack.count() < listLevel) {
if (m_listStack.count())
writer.writeStartElement(textNS, QString::fromLatin1("list-item"));
writer.writeStartElement(textNS, QString::fromLatin1("list"));
if (m_listStack.count() == listLevel - 1) {
m_listStack.push(block.textList());
writer.writeAttribute(textNS, QString::fromLatin1("style-name"), QString::fromLatin1("L%1")
.arg(block.textList()->formatIndex()));
}
else {
m_listStack.push(0);
}
}
}
writer.writeStartElement(textNS, QString::fromLatin1("list-item"));
}
else {
while (! m_listStack.isEmpty()) {
m_listStack.pop();
writer.writeEndElement(); // list
if (m_listStack.count())
writer.writeEndElement(); // list-item
}
}
if (block.length() == 1) { // only a linefeed
writer.writeEmptyElement(textNS, QString::fromLatin1("p"));
writer.writeAttribute(textNS, QString::fromLatin1("style-name"), QString::fromLatin1("p%1")
.arg(block.blockFormatIndex()));
if (block.textList())
writer.writeEndElement(); // numbered-paragraph
return;
}
writer.writeStartElement(textNS, QString::fromLatin1("p"));
writer.writeAttribute(textNS, QString::fromLatin1("style-name"), QString::fromLatin1("p%1")
.arg(block.blockFormatIndex()));
for (QTextBlock::Iterator frag= block.begin(); !frag.atEnd(); frag++) {
writer.writeCharacters(QString()); // Trick to make sure that the span gets no linefeed in front of it.
writer.writeStartElement(textNS, QString::fromLatin1("span"));
QString fragmentText = frag.fragment().text();
if (fragmentText.length() == 1 && fragmentText[0] == 0xFFFC) { // its an inline character.
writeInlineCharacter(writer, frag.fragment());
writer.writeEndElement(); // span
continue;
}
writer.writeAttribute(textNS, QString::fromLatin1("style-name"), QString::fromLatin1("c%1")
.arg(frag.fragment().charFormatIndex()));
bool escapeNextSpace = true;
int precedingSpaces = 0, precedingTabs = 0;
int exportedIndex = 0;
for (int i=0; i <= fragmentText.count(); ++i) {
bool isTab = false, isSpace = false;
if (i < fragmentText.count()) {
QChar character = fragmentText[i];
isTab = character.unicode() == '\t';
isSpace = character.unicode() == ' ';
if (character.unicode() == 0x2028) { // soft-return
writer.writeCharacters(fragmentText.mid(exportedIndex, i));
writer.writeEmptyElement(textNS, QString::fromLatin1("line-break"));
exportedIndex = i+1;
continue;
}
if (isSpace) {
++precedingSpaces;
escapeNextSpace = true;
}
else if (isTab) {
precedingTabs++;
}
}
// find more than one space. -> <text:s text:c="2" />
if (!isSpace && escapeNextSpace && precedingSpaces > 1) {
const bool startParag = exportedIndex == 0 && i == precedingSpaces;
if (!startParag)
writer.writeCharacters(fragmentText.mid(exportedIndex, i - precedingSpaces + 1 - exportedIndex));
writer.writeEmptyElement(textNS, QString::fromLatin1("s"));
const int count = precedingSpaces - (startParag?0:1);
if (count > 1)
writer.writeAttribute(textNS, QString::fromLatin1("c"), QString::number(count));
precedingSpaces = 0;
exportedIndex = i;
}
// find tabs. -> <text:tab text:tab-ref="3" /> or <text:tab/>
if (!isTab && precedingTabs) {
writer.writeCharacters(fragmentText.mid(exportedIndex, i - precedingTabs - exportedIndex));
writer.writeEmptyElement(textNS, QString::fromLatin1("tab"));
//.........这里部分代码省略.........
示例10: fileBase
QString PageGenerator::fileBase(const Node *node) const
{
if (node->relates())
node = node->relates();
else if (!node->isInnerNode())
node = node->parent();
#ifdef QDOC_QML
if (node->subType() == Node::QmlPropertyGroup) {
node = node->parent();
}
#endif
QString base = node->doc().baseName();
if (!base.isEmpty())
return base;
const Node *p = node;
forever {
const Node *pp = p->parent();
base.prepend(p->name());
#ifdef QDOC_QML
/*
To avoid file name conflicts in the html directory,
we prepend a prefix (by default, "qml-") to the file name of QML
element doc files.
*/
if ((p->subType() == Node::QmlClass) ||
(p->subType() == Node::QmlBasicType)) {
if (!base.startsWith(QLatin1String("QML:")))
base.prepend(outputPrefix(QLatin1String("QML")));
}
#endif
if (!pp || pp->name().isEmpty() || pp->type() == Node::Fake)
break;
base.prepend(QLatin1Char('-'));
p = pp;
}
if (node->type() == Node::Fake) {
#ifdef QDOC2_COMPAT
if (base.endsWith(".html"))
base.truncate(base.length() - 5);
#endif
}
// the code below is effectively equivalent to:
// base.replace(QRegExp("[^A-Za-z0-9]+"), " ");
// base = base.trimmed();
// base.replace(" ", "-");
// base = base.toLower();
// as this function accounted for ~8% of total running time
// we optimize a bit...
QString res;
// +5 prevents realloc in fileName() below
res.reserve(base.size() + 5);
bool begun = false;
for (int i = 0; i != base.size(); ++i) {
QChar c = base.at(i);
uint u = c.unicode();
if (u >= 'A' && u <= 'Z')
u -= 'A' - 'a';
if ((u >= 'a' && u <= 'z') || (u >= '0' && u <= '9')) {
res += QLatin1Char(u);
begun = true;
}
else if (begun) {
res += QLatin1Char('-');
begun = false;
}
}
while (res.endsWith(QLatin1Char('-')))
res.chop(1);
return res;
}
示例11: addTextSpan
void KoXmlWriter::addTextSpan(const QString& text, const QMap<int, int>& tabCache) {
int len = text.length();
int nrSpaces = 0; // number of consecutive spaces
bool leadingSpace = false;
QString str;
str.reserve(len);
// Accumulate chars either in str or in nrSpaces (for spaces).
// Flush str when writing a subelement (for spaces or for another reason)
// Flush nrSpaces when encountering two or more consecutive spaces
for (int i = 0; i < len; ++i) {
QChar ch = text[i];
ushort unicode = ch.unicode();
if (unicode == ' ') {
if (i == 0)
leadingSpace = true;
++nrSpaces;
} else {
if (nrSpaces > 0) {
// For the first space we use ' '.
// "it is good practice to use (text:s) for the second and all following SPACE
// characters in a sequence." (per the ODF spec)
// however, per the HTML spec, "authors should not rely on user agents to render
// white space immediately after a start tag or immediately before an end tag"
// (and both we and OO.o ignore leading spaces in <text:p> or <text:h> elements...)
if (!leadingSpace) {
str += ' ';
--nrSpaces;
}
if (nrSpaces > 0) { // there are more spaces
if (!str.isEmpty())
addTextNode(str);
str.clear();
startElement("text:s");
if (nrSpaces > 1) // it's 1 by default
addAttribute("text:c", nrSpaces);
endElement();
}
}
nrSpaces = 0;
leadingSpace = false;
switch (unicode) {
case '\t':
if (!str.isEmpty())
addTextNode(str);
str.clear();
startElement("text:tab");
if (tabCache.contains(i))
addAttribute("text:tab-ref", tabCache[i] + 1);
endElement();
break;
// gracefully handle \f form feed in text input.
// otherwise the xml will not be valid.
// \f can be added e.g. in ascii import filter.
case '\f':
case '\n':
case QChar::LineSeparator:
if (!str.isEmpty())
addTextNode(str);
str.clear();
startElement("text:line-break");
endElement();
break;
default:
// don't add stuff that is not allowed in xml. The stuff we need we have already handled above
if (ch.unicode() >= 0x20) {
str += text[i];
}
break;
}
}
}
// either we still have text in str or we have spaces in nrSpaces
if (!str.isEmpty()) {
addTextNode(str);
}
if (nrSpaces > 0) { // there are more spaces
startElement("text:s");
if (nrSpaces > 1) // it's 1 by default
addAttribute("text:c", nrSpaces);
endElement();
}
}
示例12: filterEvent
bool QUimInputContext::filterEvent( const QEvent *event )
{
#ifdef ENABLE_DEBUG
// qDebug("filterEvent");
#endif
int type = event->type();
if ( type != QEvent::KeyPress &&
type != QEvent::KeyRelease )
return FALSE;
QKeyEvent *keyevent = ( QKeyEvent * ) event;
int qkey = keyevent->key();
int modifier = 0;
if ( keyevent->state() & Qt::ShiftButton )
modifier |= UMod_Shift;
if ( keyevent->state() & Qt::ControlButton )
modifier |= UMod_Control;
if ( keyevent->state() & Qt::AltButton )
modifier |= UMod_Alt;
#if defined(Q_WS_X11)
if ( keyevent->state() & Qt::MetaButton )
modifier |= UMod_Meta;
#endif
int key = 0;
if ( isascii( qkey ) && isprint( qkey ) )
{
int ascii = keyevent->ascii();
if ( isalpha( ascii ) )
{
key = ascii; // uim needs lower/upper encoded key
}
else
{
if ( keyevent->state() & Qt::ControlButton &&
( ascii >= 0x01 && ascii <= 0x1a ) )
if ( keyevent->state() & Qt::ShiftButton )
key = ascii + 0x40;
else
key = ascii + 0x60;
else
key = qkey;
}
}
else if ( qkey == Qt::Key_unknown )
{
QString text = keyevent->text();
if ( !text.isNull() )
{
QChar s = text.at(0);
key = unicodeToUKey ( s.unicode() );
}
else
{
key = UKey_Other;
}
}
else
{
if ( qkey >= Qt::Key_F1 && qkey <= Qt::Key_F35 )
{
key = qkey - Qt::Key_F1 + UKey_F1;
}
else if ( qkey >= Qt::Key_Dead_Grave && qkey <= Qt::Key_Dead_Horn )
{
key = qkey - Qt::Key_Dead_Grave + UKey_Dead_Grave;
}
else if ( qkey >= Qt::Key_Kanji && qkey <= Qt::Key_Eisu_toggle )
{
key = qkey - Qt::Key_Kanji + UKey_Kanji;
}
else if ( qkey >= Qt::Key_Hangul && qkey <= Qt::Key_Hangul_Special )
{
key = qkey - Qt::Key_Hangul + UKey_Hangul;
}
else
{
switch ( qkey )
{
case Qt::Key_Tab: key = UKey_Tab; break;
case Qt::Key_BackSpace: key = UKey_Backspace; break;
case Qt::Key_Escape: key = UKey_Escape; break;
case Qt::Key_Delete: key = UKey_Delete; break;
case Qt::Key_Return: key = UKey_Return; break;
case Qt::Key_Left: key = UKey_Left; break;
case Qt::Key_Up: key = UKey_Up; break;
case Qt::Key_Right: key = UKey_Right; break;
case Qt::Key_Down: key = UKey_Down; break;
case Qt::Key_Prior: key = UKey_Prior; break;
case Qt::Key_Next: key = UKey_Next; break;
case Qt::Key_Home: key = UKey_Home; break;
case Qt::Key_End: key = UKey_End; break;
case Qt::Key_Multi_key: key = UKey_Multi_key; break;
case Qt::Key_Mode_switch: key = UKey_Mode_switch; break;
case Qt::Key_Codeinput: key = UKey_Codeinput; break;
case Qt::Key_SingleCandidate: key = UKey_SingleCandidate; break;
case Qt::Key_MultipleCandidate: key = UKey_MultipleCandidate; break;
//.........这里部分代码省略.........
示例13: nextTokenKind
int Lexer::nextTokenKind()
{
int token = Parser::Token_INVALID;
if (m_curpos >= m_contentSize) {
m_tokenBegin = -1;
m_tokenEnd = -1;
createNewline(m_curpos);
return 0;
}
QChar* it = m_content.data();
it += m_curpos;
m_tokenBegin = m_curpos;
if (it->isSpace())
{
token = Parser::Token_WHITESPACE;
while (m_curpos < m_contentSize && it->isSpace())
{
if (it->unicode() == '\n')
{
createNewline(m_curpos);
}
it++;
m_curpos++;
}
m_curpos--;
}
else if (it->isDigit())
{
QRegExp regex("\\d+\\.\\d+|\\d+\\.\\d+|\\d+\\.\\d+e-?\\d+|\\d+\\.\\d+e-?\\d+|[\\dABCDEF]+#\\d{1,2}|\\d+");
if ( regex.indexIn(m_content, m_curpos) != -1)
{
kDebug() << "Matched: " << regex.cap();
m_curpos += regex.matchedLength() - 1;
token = Parser::Token_INTEGER_LITERAL;
}
}
else if (it->unicode() == '-')
{
if ((it + 1)->unicode() == '>')
{
m_curpos++;
token = Parser::Token_LEADS_TO;
}
else if ((it + 1)->unicode() == '-')
{
m_curpos++;
token = Parser::Token_LIST_DIFFERENCE;
}
else
{
token = Parser::Token_MINUS;
}
}
else if (it->unicode() == '+')
{
if ((it + 1)->unicode() == '+')
{
m_curpos++;
token = Parser::Token_LIST_ADDITION;
}
else
{
token = Parser::Token_PLUS;
}
}
else if (it->unicode() == '$' && processCharLiteral(it + 1))
{
token = Parser::Token_CHAR_LITERAL;
}
else if (it->unicode() == '}')
{
token = Parser::Token_RBRACE;
if (state() == Tuple)
{
popState();
}
}
else if (it->unicode() == '_')
{
token = Parser::Token_UNDERLINE;
}
else if (it->unicode() == '{')
{
token = Parser::Token_LBRACE;
pushState(Tuple);
}
else if (it->unicode() == ')')
{
token = Parser::Token_RPAREN;
}
else if (it->unicode() == '(')
{
token = Parser::Token_LPAREN;
}
else if (it->unicode() == ']')
{
token = Parser::Token_RBRACKET;
//.........这里部分代码省略.........
示例14: playDTMFTone
void DTMFServiceDepricated::playDTMFTone(const QChar& keyToPlay)
{
PHONE_DEBUG2("DTMFServiceDepricated::playDTMFTone keyToPlay:", keyToPlay);
m_parameters.SetKeyCode(keyToPlay.unicode());
TRAP_IGNORE( m_call.HandlePlayDTMFL() );
}
示例15: AddText
// Draw a line of text in the given position within the image.
// It would be nice to be able to use TTFFont for this but it doesn't provide
// what we want.
void MHIText::AddText(int x, int y, const QString &str, MHRgba colour)
{
if (!m_parent->IsFaceLoaded()) return;
FT_Face face = m_parent->GetFontFace();
FT_Error error = FT_Set_Char_Size(face, 0, Point2FT(m_fontsize),
FONT_WIDTHRES, FONT_HEIGHTRES);
// X positions are computed to 64ths and rounded.
// Y positions are in pixels
int posX = Point2FT(x);
int pixelY = y;
FT_Bool useKerning = FT_HAS_KERNING(face);
FT_UInt previous = 0;
int len = str.length();
for (int n = 0; n < len; n++)
{
// Load the glyph.
QChar ch = str[n];
FT_UInt glyphIndex = FT_Get_Char_Index(face, ch.unicode());
if (glyphIndex == 0)
{
previous = 0;
continue;
}
if (useKerning && previous != 0)
{
FT_Vector delta;
FT_Get_Kerning(face, previous, glyphIndex,
FT_KERNING_DEFAULT, &delta);
posX += delta.x;
}
error = FT_Load_Glyph(face, glyphIndex, FT_LOAD_RENDER);
if (error)
continue; // ignore errors
FT_GlyphSlot slot = face->glyph;
if (slot->format != FT_GLYPH_FORMAT_BITMAP)
continue; // Problem
if ((enum FT_Pixel_Mode_)slot->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY)
continue;
unsigned char *source = slot->bitmap.buffer;
// Get the origin for the bitmap
int baseX = FT2Point(posX) + slot->bitmap_left;
int baseY = pixelY - slot->bitmap_top;
// Copy the bitmap into the image.
for (int i = 0; i < slot->bitmap.rows; i++)
{
for (int j = 0; j < slot->bitmap.width; j++)
{
int greyLevel = source[j];
// Set the pixel to the specified colour but scale its
// brightness according to the grey scale of the pixel.
int red = colour.red();
int green = colour.green();
int blue = colour.blue();
int alpha = colour.alpha() *
greyLevel / slot->bitmap.num_grays;
int xBit = j + baseX;
int yBit = i + baseY;
// The bits ought to be inside the bitmap but
// I guess there's the possibility
// that rounding might put it outside.
if (xBit >= 0 && xBit < m_width &&
yBit >= 0 && yBit < m_height)
{
m_image.setPixel(xBit, yBit,
qRgba(red, green, blue, alpha));
}
}
source += slot->bitmap.pitch;
}
posX += slot->advance.x;
previous = glyphIndex;
}
}