QTextEdit 控件的妙用(以及与QPlainTextEdit的区别)
2017-08-03 14:21
846 查看
1.QTextEdit 可以将 纯文本plainText 转化为 富文本 htmlText:
若设置文本setText 函数放在设置样式代码的前面:
2. QTextEdit 可以获取富文本的高度,判断是否越界。
通过使用QTextCursor,将光标移动到 Document 的LastBlock 的LastFragment,用cursorRect 函数获取光标在Document 的位置,即获取了最大高度。
3. 与QPlainTextEdit 的区别
QPlainTextEdit 为纯文本的编辑框,QTextEdit 支持富文本。
setText 函数中 参数 text 的 ‘\n’ 会被QPlainTextEdit 识别为换行,而在后者识别为空格。由此,由‘\n’分割的多段(block)的纯文本,不能使用QTextEdit 来显示及计算位置等。
4. 由2 延伸,可获取规定尺寸下,富文本的换行位置,也就是每段block
的位置,在开放的文本绘制中可能会遇到(比如在空白纸上绘制,宽度会越界)。
QTextEdit textEdit; textEdit.setFont(font); textEdit.setFontItalic(true); textEdit.setTextColor(QColor(100, 100, 100)); textEdit.setText("纯文本PlainText"); qDebug() << "toHtml " << textEdit.toHtml() << endl;
若设置文本setText 函数放在设置样式代码的前面:
textEdit.setText("纯文本PlainText");或者创建QTextEdit 时用的是:
QTextEdit textEdit("PlainText");则得到的Html 富文本只有字体类型和大小,再无其他格式。
2. QTextEdit 可以获取富文本的高度,判断是否越界。
通过使用QTextCursor,将光标移动到 Document 的LastBlock 的LastFragment,用cursorRect 函数获取光标在Document 的位置,即获取了最大高度。
void resizeHtmlText(QString& htmlText, const QSizeF& rcf) { QTextEdit *tmpEdit = new QTextEdit; tmpEdit->setAlignment(Qt::AlignTop); tmpEdit->setFrameShape(QFrame::NoFrame); tmpEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); tmpEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); tmpEdit->setLineWrapMode(QTextEdit::WidgetWidth); tmpEdit->setHtml(htmlText); tmpEdit->resize(rcf.width(), rcf.height()); tmpEdit->move(100,50); tmpEdit->show(); QTextDocument *textDoc = tmpEdit->document(); QTextCursor textCursor(textDoc); QTextBlock lastBlock = textDoc->lastBlock(); QTextBlock::iterator it = lastBlock.end(); if(it != lastBlock.begin()) it--; if(it.atEnd()) break; QTextFragment lastFragm = it.fragment(); int pos = lastFragm.position() + lastFragm.length(); textCursor.setPosition(pos, QTextCursor::MoveAnchor); QRectF rcPos = tmpEdit->cursorRect(textCursor); qreal botm = rcPos.y() + rcPos.bottom(); if(botm - 4 > rcf.height()) // 4 QTextEdit Frame Width qDebug() << "富文本高度越界"; tmpEdit->hide(); delete tmpEdit; }
3. 与QPlainTextEdit 的区别
QPlainTextEdit 为纯文本的编辑框,QTextEdit 支持富文本。
setText 函数中 参数 text 的 ‘\n’ 会被QPlainTextEdit 识别为换行,而在后者识别为空格。由此,由‘\n’分割的多段(block)的纯文本,不能使用QTextEdit 来显示及计算位置等。
4. 由2 延伸,可获取规定尺寸下,富文本的换行位置,也就是每段block
的位置,在开放的文本绘制中可能会遇到(比如在空白纸上绘制,宽度会越界)。
QTextEdit tmpEdit; tmpEdit.setFrameShape(QFrame::NoFrame); tmpEdit.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); tmpEdit.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); tmpEdit.setLineWrapMode(QTextEdit::WidgetWidth); tmpEdit.setHtml(tmpHtmlText); tmpEdit.resize(editBox.width(), editBox.height()); tmpEdit.move(-2000,-2000); tmpEdit.show(); // 因为用到光标QTextCursor,所以Edit必须show。 QTextDocument *textDoc = tmpEdit.document(); QTextCursor textCursor(textDoc); QTextBlock block = textDoc->firstBlock(); QRect rcPos; qreal tx, ty; while(block.isValid()) { for(QTextBlock::iterator it = block.begin(); !it.atEnd(); it++) { QTextFragment fragm = it.fragment(); QTextCharFormat charFmt = fragm.charFormat(); QString textStr = fragm.text(); int spos = fragm.position(); // 文本块起始位置 int npos = spos; // 文本块结束位置 while(spos < fragm.position() + fragm.length()) { textCursor.setPosition(npos, QTextCursor::MoveAnchor); rcPos = tmpEdit.cursorRect(textCursor); tx = rcPos.x(); ty = rcPos.y(); while(npos < fragm.position() + fragm.length()){ textCursor.setPosition(npos + 1, QTextCursor::MoveAnchor); rcPos = tmpEdit.cursorRect(textCursor); if(qAbs(rcPos.y() - ty) > 0.1) break; npos++; // 累加,直到rcPos.y() 与ty不相等,说明换行了 } tx += editBox.x(); ty += editBox.y(); textCursor.setPosition(spos, QTextCursor::MoveAnchor); textCursor.setPosition(npos, QTextCursor::KeepAnchor); rcPos = tmpEdit.cursorRect(textCursor); QString tmpStr = textStr.mid(spos - fragm.position(), npos - spos); spos = npos; // 字符 tmpStr // 文本格式 charFmt // 位置 tx,ty } } block = block.next(); }
相关文章推荐
- android控件之EditText输入框之值监控以及类型限制(数字,英语字母,下划线,是否为星号密码)
- QT中LineEdit、TextEdit 、PlainTextEdit 三个控件的区别
- 解决QT中文5.6 QTextEdit QPlainTextEdit的右键菜单翻译不全
- QTextEdit/QPlainTextEdit添加文字超出视图后,滚动条自动移至最底部
- ListView,gallery与内部控件事件冲突以及EditText回退键和回车键失效
- 隐藏Android中EditText控件的下划线以及光标
- QTextEdit 、QPlainTextEdit设置插入字体颜色
- QTextEdit/QPlainTextEdit添加文字超出视图后,滚动条自动移至最底部
- Qt学习笔记之QTextEdit 、QPlainTextEdit
- android中的EditText如何屏蔽软键盘以及在屏蔽软键盘弹出其它对话框之类的控件的问题
- 让edittext控件显示圆角边框
- Android用户界面 UI组件--TextView及其子类(三) EditView以及各种Span文字样式讲解
- Android控件用法总结之EditText
- ImageView的src和background的区别以及两者的妙用
- 详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息
- Android中TextView与EditText控件实现禁止换行
- Android02--Android之UI控件TextView+Button+EditText
- Android实现EditText控件禁止输入内容的方法(附测试demo)
- [转]Android EditText不弹出输入法以及光标设置
- 强大的提示控件TextInputLayout使用以及源码分析