如何获取QPlainTextEdit边框与文本间的像素偏移距离?
问题
在QPlainTextEdit中输入的第一个字符存在几像素的偏移,需要在代码中获取该偏移值(即红线与选中字符的间距)。尝试调用viewportMargins().left()和contentsMargins().left(),返回值均为0,求其他可行方法。
代码示例:
#include <QApplication> #include <QPlainTextEdit> #include <QPainter> class TextEdit : public QPlainTextEdit { protected: void paintEvent( QPaintEvent * e ) override { QPainter p( viewport() ); p.setPen( Qt::red ); p.drawRect( viewport()->rect() ); QPlainTextEdit::paintEvent( e ); } }; int main( int argc, char ** argv ) { QApplication app( argc, argv ); TextEdit e; e.resize( 100, 100 ); e.show(); return QApplication::exec(); }
解决方案
可以通过以下两种方法获取该偏移量:
利用光标位置计算
定位到文档第一个字符的光标位置,将光标矩形的左坐标和视口左边界做差值,就能得到偏移量:int getLeftOffset() { QTextCursor cursor = document()->begin(); // 移动到第一个字符的位置 cursor.movePosition(QTextCursor::NextCharacter); // 获取该字符在视口中的矩形 QRect charRect = cursorRect(cursor); // 计算偏移:字符左边界 - 视口左边界 return charRect.left() - viewport()->rect().left(); }通过文本块布局获取
直接访问第一个文本块的布局信息,布局的x坐标就是文本内容相对于视口的偏移:int getBlockLayoutOffset() { QTextBlock firstBlock = document()->firstBlock(); if (!firstBlock.isValid()) return 0; QTextLayout *layout = firstBlock.layout(); if (!layout) return 0; return layout->position().x(); }
如果要在你的paintEvent里验证这个偏移值,可以添加代码直观查看:
void paintEvent( QPaintEvent * e ) override { // 先绘制文本内容 QPlainTextEdit::paintEvent( e ); QPainter p( viewport() ); p.setPen( Qt::red ); p.drawRect( viewport()->rect() ); // 绘制偏移参考线 int offset = getLeftOffset(); p.setPen( Qt::blue ); p.drawLine(viewport()->rect().left() + offset, 0, viewport()->rect().left() + offset, viewport()->height()); }
内容的提问来源于stack exchange,提问作者Igor Mironchik
相关产品推荐
相关产品推荐

