QT TextEdit的一些总结
2016-01-11 16:17
381 查看
1.HTML形式操纵Qtextedit
QTextEdit支持HTML的一个子集, 所以对于简单的使用, 可以直接插入HTML代码
通过插入html代码, 可以实现图片, 字体, 字号, 颜色等功能
ps: QTextEdit中img标签仅支持src, width, height三个属性, 使用其他属性会自动被Qt过滤掉, 即editor->toHtml()中无法找到可以通过正则来过滤toHtml()生成的代码
1.在QTextEdit中播放gif
QTextEdit虽然直接img标签, 但默认不播放gif, 也不会显示gif的第一帧 (如果你不需要编辑功能的话, 其实可以用QWebView来查看)
所以在QTextEdit中播放gif需要手动换帧.
QMovie内置了gif解析和定时器功能.
QTextDocument 使用addResource 把图片资源加载进来, 然后通过QMovie->start启动定时器, 不断更新图片资源
g_url 是自定义的标签, 用来标记QTextDocument 中的resource
addResource 指定ImageResource, 然后根据url, 若url已存在, 则更新资源, 若url不存在, 则添加资源
这样就实现刷新gif的帧. 这样, QTextEdit就会显示gif动画了
最后是添加gif图片:
可以插入HTML:
editor->append(“ ”);
即img中指定为我们自定义的url即可
也可以使用QTextCursor插入:
1.如何遍历QTextEdit中的内容
QTextEdit中的内容实际上是由QTextDocument维护
可以简单的理解: QTextDocument 包含 N个QTexBlock(段落), 每个QTexBlock包含N个QTextFragment
这段代码用于渲染QTextEdit为炫彩, 每个字随机分配一种颜色
遍历的时候, 判断是图片还是文字. 并作相应的处理
同时, 处理下QTextDocument的contentChange事件, 即可在键盘输入时, 就改变字的颜色
QTextEdit支持HTML的一个子集, 所以对于简单的使用, 可以直接插入HTML代码
[code]m_ui.textEdit->append("<img src=':/LogTray.png'>");
通过插入html代码, 可以实现图片, 字体, 字号, 颜色等功能
ps: QTextEdit中img标签仅支持src, width, height三个属性, 使用其他属性会自动被Qt过滤掉, 即editor->toHtml()中无法找到可以通过正则来过滤toHtml()生成的代码
1.在QTextEdit中播放gif
QTextEdit虽然直接img标签, 但默认不播放gif, 也不会显示gif的第一帧 (如果你不需要编辑功能的话, 其实可以用QWebView来查看)
所以在QTextEdit中播放gif需要手动换帧.
QMovie内置了gif解析和定时器功能.
QTextDocument 使用addResource 把图片资源加载进来, 然后通过QMovie->start启动定时器, 不断更新图片资源
[code]QString g_fileName = ":/test.gif"; QUrl g_url("TestImageTag");
[code]void MyClass::InsertImage() { QMovie* movie = new QMovie(this); movie->setFileName(g_fileName); movie->setCacheMode(QMovie::CacheNone); //换帧时刷新 connect(movie, SIGNAL(frameChanged(int)), this, SLOT(OnAnimate(int))); movie->start(); }
g_url 是自定义的标签, 用来标记QTextDocument 中的resource
[code]void MyClass::OnAnimate(int a) { if (QMovie* movie = qobject_cast<QMovie*>(sender())) { document()->addResource(QTextDocument::ImageResource, //替换图片为当前帧 g_url, movie->currentPixmap()); setLineWrapColumnOrWidth(lineWrapColumnOrWidth()); // 刷新显示 } }
addResource 指定ImageResource, 然后根据url, 若url已存在, 则更新资源, 若url不存在, 则添加资源
这样就实现刷新gif的帧. 这样, QTextEdit就会显示gif动画了
最后是添加gif图片:
可以插入HTML:
editor->append(“ ”);
即img中指定为我们自定义的url即可
也可以使用QTextCursor插入:
[code]QTextCursor cursor = editor->textCursor(); QTextImageFormat imageFormat; imageFormat.setName("TestImageTag"); cursor.insertImage(imageFormat);
1.如何遍历QTextEdit中的内容
QTextEdit中的内容实际上是由QTextDocument维护
可以简单的理解: QTextDocument 包含 N个QTexBlock(段落), 每个QTexBlock包含N个QTextFragment
[code]QColor _GetRamdomColor() { QColor col; int RamdomNum = rand() % 0xffffff; char strCol[8]; sprintf(strCol, "#%06x", RamdomNum); col.setNamedColor(QString::fromLocal8Bit(strCol, 8)); return col; } void MyClass::OnTest() { QTextDocument *document = ui.textEdit->document(); QTextBlock ¤tBlock = document->begin(); QTextBlock::iterator it; QTextCursor cursor = ui.textEdit->textCursor(); while( true) { // 在修改chatformat时会改变当前Block的fragment // 所以++it的处理类似std::map中的erase操作 for (it = currentBlock.begin(); !(it.atEnd()); ) { QTextFragment currentFragment = it.fragment(); QTextImageFormat newImageFormat = currentFragment.charFormat().toImageFormat(); if (newImageFormat.isValid()) { // 判断出这个fragment为image ++it; continue; } if (currentFragment.isValid()) { ++it; int pos = currentFragment.position(); QString strText = currentFragment.text(); for(int i = 0; i < strText.length(); i++) { // 选择一个字, 随机设定颜色 QTextCharFormat fmt; fmt.setForeground(_GetRamdomColor()); QTextCursor helper = cursor; helper.setPosition(pos++); helper.setPosition(pos, QTextCursor::KeepAnchor); helper.setCharFormat(fmt); } } } currentBlock = currentBlock.next(); if(!currentBlock.isValid()) break; } // 光标移动到最后, 并设置拥有焦点 QTextCursor c = ui.textEdit->textCursor(); c.movePosition(QTextCursor::End, QTextCursor::MoveAnchor); ui.textEdit->setTextCursor(c); ui.textEdit->setFocus(Qt::MouseFocusReason); }
这段代码用于渲染QTextEdit为炫彩, 每个字随机分配一种颜色
遍历的时候, 判断是图片还是文字. 并作相应的处理
同时, 处理下QTextDocument的contentChange事件, 即可在键盘输入时, 就改变字的颜色
[code]connect(document, SIGNAL(contentsChange( int , int , int )), this, SLOT(OnContentChange( int , int , int )));
[code]void MyClass::OnContentChange( int position, int charsRemoved, int charsAdded ) { if(charsAdded == 0) return; QTextCursor cursor = ui.textEdit->textCursor(); for (int i = 0; i < charsAdded; i++ ) { int pos = position + i; // 选择一个字, 随机设定颜色 QTextCharFormat fmt; fmt.setForeground(_GetRamdomColor()); QTextCursor helper = cursor; helper.setPosition(pos); helper.setPosition(pos+1, QTextCursor::KeepAnchor); helper.setCharFormat(fmt); } }
相关文章推荐
- QT 多线程事件通讯
- qt&gdal
- Qt 知识的总结
- Qt学习(16)
- Qt5.5.0 vs2013 64位编译
- 最近在 OS-10.9下配置opencv, cgal, latex, qt, pillow
- Qt父-子对象机制
- QT控件提升之QPushButton提升为QMenu
- MQTT协议及拓展
- <二> Qt更新sqlite3插件
- Qt学习之parent参数
- Qt下OpenCv中cvGetWindowHandle的使用
- QT窗体滑动(QPropertyAnimation)
- 自学QT之创建json
- Qt 程序运行过程中提示toolChains.xml磁盘已满
- ubuntu下QT出现cannot find -lGL错误的解决办法
- 关于Qt的图形旋转问题
- Retrieve OpenGL Context from Qt 5.5 on OSX
- QT 编写Rtf(富文本格式) 文件实例
- VS201x+Qt5开发,中文乱码解决