我正在做的事情是一个QTreeWidget,每个Item的文本都是可编辑的。 所以我在一个小部件中组合复选框,QTextEdit / QPlainTextEdit togeter, 和QTreeWidget的每个项目的setItemWidget。 我已经将QTextEdit的scrollBar设置为关闭,我甚至不希望它可以通过鼠标中键滚动。因为我在其父窗口小部件上绘制点线,间距为25像素。我希望每个文本行都固定在每个点线的顶部,不能滚动。
所以我需要:
1>确保每个文本行的高度为25像素。每个文本行位于点线上方。
2 - ;将QTextEdit的大小调整为25 * LineCount高度,禁用QTextEdit的滚动功能。
当文本改变时,我将重置Qt :: sizeHintRole数据以调整QTreeWidgetItem的高度。为此,我必须正确计算所需的高度。
所有文本都只是纯文本,但启用了wordwrap。
这就是我所拥有的:
我的设置行高度代码:(ui-> textLbl是我的QTextEdit小部件,LineHeight是25)
QTextDocument* doc = ui->textLbl->document();
QTextCursor textCursor = ui->textLbl->textCursor();
for(QTextBlock it = doc->begin(); it != doc->end(); it = it.next())
{
QTextBlockFormat textBlockFormat = it.blockFormat();
textBlockFormat.setLineHeight(LineHeight,QTextBlockFormat::FixedHeight); //set line height
textCursor.setBlockFormat(textBlockFormat);
ui->textLbl->setTextCursor(textCursor);
}
这是项目#2的字符串I setPlainText(): “Small Refine:高级模式没有效果。\ nHaha,bingo!\ n我喜欢多行。” 结果是这样的:
1>问题1:我无法获得正确的行数,包括由wordwrap功能引起的行。
2 - ;问题#2:似乎setLineHeight仅适用于带有一个段落的文本行。 我无法控制不同段落的间距。
因此,如果我手动删除QTextEdit控件中的所有换行符号,并按Enter键重新制作newLine, 它变成了:
这就是我想要的。但我需要的文本也可以通过setText方法设置。
第3>问题#3:仍然可以通过鼠标中键滚动。我在QTextEdit上使用midMouse按钮滚动,我发现这些是行下方的额外像素.QTextEdit是可滚动的。
有人可以帮助解决这三个问题吗?非常感谢:)。
答案 0 :(得分:2)
1)尝试使用
textEdit->document()->size().height()
2)textCursor仍然在文档的开头(第一个块),使用
QTextCursor cursor(it);
而是在for-cycle中获取给定QTextBlock的QTextCursor。
3)滚动条:
textEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
和
textEdit->verticalScrollBar()->setMaximum(0)
(或连接信号valueChanged / sliderMove和setValue再次为零)