Nic*_*fan 4 c++ qt custom-controls qtextedit qtextdocument
我有兴趣创建一个行为类似于代码区域的文本对象类型(继承QTextObjectInterface):
文档的其他区域需要以通常的方式运行(字体属性可编辑、颜色可编辑等)。
Qt 提供了一个使用QTextEdit实现自定义文本对象的示例。这看起来很难,因为新的文本对象不能使用 QTextEdit / QTextDocument中的现有基础结构。
可以将QTextDocument 的各个部分组合在一起的不同类型对象的基类
所以继承它可能是一种选择,但它在 Qt SDK 包中的源文件和谷歌搜索都没有透露有用的信息。
QTextFrame继承了QTextObject,因此,如果要找到有关此路径的一些提示,它可能是一个可行的基类。
在一个简单的 HTML 文件中,所有这些(语法高亮除外)都很容易。QTextEdit以 html 为输入,能够导出 html,但在此过程中会丢失结构。
<code class="code-sample">
int i = 0;
</code>
Run Code Online (Sandbox Code Playgroud)
顺便说一下,QWebView是只读的。它的广告是:
HTML 文档的一部分可以是可编辑的,例如通过 HTML 元素上的 contenteditable 属性。
可能还有其他平台可以轻松使用,但是文本编辑器需要作为插件在Qt Creator 内部使用,所以使用Qt 框架是有意义的。
底线:如何在QTextEdit小部件中实现代码区域?
后期编辑:
我发现使用 QTextEdit / QTextDocument 可以实现这一点。我能想到的最简单的实现在此答案中提供,以供将来的寻求者参考。
请注意,需要自定义保存/加载,因为常规 .toHtml() 不会保留所需的信息。
插入代码块很简单:
QTextFrame * frame;
frame = cursor.insertFrame( code_block_format_ );
connect( frame, SIGNAL( destroyed() ),
this, SLOT( codeBlockDeleted() ) );
code_blocks_.append( frame );
Run Code Online (Sandbox Code Playgroud)
请注意您可以在类中保存的两个变量:
QTextFrameFormat code_block_format_;
QList<const QTextFrame*> code_blocks_;
Run Code Online (Sandbox Code Playgroud)
我们需要框架的格式是一致的和独特的。它可以在构造函数中初始化为:
code_block_format_.setBackground( QBrush( Qt::yellow ) );
code_block_format_.setBorder( 1 );
code_block_format_.setBorderStyle( QTextFrameFormat::BorderStyle_Inset);
code_block_format_.setMargin( 10 );
code_block_format_.setPadding( 4 );
Run Code Online (Sandbox Code Playgroud)
我们需要列表,以便我们可以判断某个帧是否是代码框。由于所有继承 QTextObject 的对象都需要由 QTextDocument::createObject() 创建,我们不能简单地将 QTextFrame 子类化(实际上我认为我们可以,但还不确定)。
现在可以按照通常的方式将代码内容与其他内容分开:
for ( it = frame->begin(); !(it.atEnd()); ++it ) {
child_frame = it.currentFrame();
child_block = it.currentBlock();
if ( child_frame != NULL )
{
if ( code_blocks_.contains( frame ) )
{
/* ... */
}
}
} /* for ( it = frame->begin(); !(it.atEnd()); ++it ) */
Run Code Online (Sandbox Code Playgroud)
但请注意,为了简洁起见,这被过度简化了。需要考虑嵌套框架。
如果您对完整实现感兴趣,请查看git 存储库(正在进行中,2012 年 11 月)。
| 归档时间: |
|
| 查看次数: |
2675 次 |
| 最近记录: |