Qt|文本首行缩进以及换行显示

1,063 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

标题描述的比较简单,具体实现的效果是什么样子的呢?

如图所示:

正确图.png

每一段都会进行换行,并且每换行一次都会进行首行缩进。

如果你是想要实现这样的效果,那么就继续看我是如何实现的!

对于文本显示,这里采用QLabel控件。但是,使用常规setStyleSheet方法并不能实现这种效果,该如何操作呢?

前段时间更新过一篇文章,是如何改变QLabel的行间距,首行缩进的设置方法与改变行间距的类似,都是采用了html的方式,如果有想看的,可以查看这个链接更改文本行间距

1:读取一段具有换行的文本

这里我们可以读取任意文本信息,只要带有换行的就可以,在这里我定义了一个:1.txt。里面存储了一篇小散文。

C++流方式读取文件

std::string QLabelTest::ReadFile(std::string spath)
{
	std::ifstream readFile;
	readFile.open(spath);
	if (readFile.fail())
	{
		return ""; //文件读取失败
	}
	std::stringstream streambuffer;
	streambuffer << readFile.rdbuf();
	std::string sData(streambuffer.str());
	return sData;
}

2:首行缩进方法

进行首行缩进的最最核心的代码,如下:

QString qsTest = "<p style='margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; text-indent:26px; '>" + qsTest + "</p>";

使用了这段代码设置首行缩进时,不再是使用setStyleSheet设置风格了,而是使用了setText

qsTest是读取的1.txt中的内容,我们这样直接设置,发现效果不是最开始的效果,而是下图展示的样子:

错误缩进.png

只有在第一段的开始出现了首行缩进,段落中的换行符也变得没有了!

这才发现,使用我设置的html加载文本的方式,居然只能识别一个段落!那么中间换行的段落该如何处理呢?

最简单的方法,读取了文本内容后,根据换行符的个数进行截取。这也是最笨的方式。

QString qsShow;
QStringList qsList = qsData.split("\n");
foreach(QString qsSingle, qsList)
{
	qsShow += "<p style='margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; text-indent:26px; '>" + qsSingle + "</p>";
}
ui.label->setText(qsShow);

调试运行后发现,果真与文章最开始的效果一致了。

这里,我才用了每个段落都进行首行缩进,其实还有更为方便的方法,这篇文章中就不再过多说明了。

我是中国好公民st,一名C++开发程序猿~