QTextEdit 控件的妙用(以及与QPlainTextEdit的区别)
来源:互联网 发布:德州用友软件 编辑:程序博客网 时间:2024/06/03 17:00
1.QTextEdit 可以将 纯文本plainText 转化为 富文本 htmlText:
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 WidthqDebug() << "富文本高度越界"; 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(); }
阅读全文
1 0
- QTextEdit 控件的妙用(以及与QPlainTextEdit的区别)
- QPlainTextEdit、QTextEdit、QColorDialog的汉化
- QTextEdit 控件的学习
- QTextEdit和QPlainTextEdit样式表中属性选择器不起作用的问题
- 解决QT中文5.6 QTextEdit QPlainTextEdit的右键菜单翻译不全
- QTextEdit、QTextView、QTextBrowser的区别
- 自定义控件的使用以及与用户控件的区别
- ABAP [div '/'] 的区别与妙用
- QTextEdit 、QPlainTextEdit设置插入字体颜色
- Qt学习笔记之QTextEdit 、QPlainTextEdit
- Qt5中部分自带控件菜单(QLineEdit、QTextEdit右键菜单)的汉化
- Qt5中部分自带控件菜单(QLineEdit、QTextEdit右键菜单)的汉化
- 宏的妙用以及与函数的比较
- QTextEdit的段落排版
- 计算QTextEdit的高度
- QTextEdit 的一些总结
- QTextEdit 的 placeholderText 属性
- 状态机与编程以及函数指针数组的妙用
- 【2017summer Day1】
- 树的一些总结
- Java发送新浪微博的问题
- supermap地图展示OD图
- 1968-输出计算步数
- QTextEdit 控件的妙用(以及与QPlainTextEdit的区别)
- 深入研究Servlet线程安全性问题
- petalinux 使用过程中的问题
- Android版本更新功能
- 心态对,才能走的更远
- Window Shadowsocks 下载地址
- [LeetCode]145. Binary Tree Postorder Traversal--二叉树的后序遍历
- [编程题] 制造回文
- 关于部署(Spring+MyBatis)web项目到Linux服务器