Qt——文本打印与光标定位

1.QPlainTextEdit通过QTextDocument对象存储文本数据

QPlainTextEdit本身只负责界面形态的显示

QPlainTextEdit包括QTextDocument和QTextCursor(负责光标)

2.QTextDocument是表示文本以及文本属性的数据类

  • 设置文本的属性:排版、字体、标题等
  • 获取文本参数:行数、文本宽度、文本信息等
  • 实现标准操作:撤销、重做、查找、打印等

3.打印功能的实现步骤

  • 连接QAction打印对象的信号到槽函数

  • 在槽函数中定义QPrintDialog对象

  • 根据用户选择获取QPrinter对象

  • 通过QTextDocument对象进行打印

    void MainWindow::onFilePrint()
    {
    QPrintDialog dlg(this);

    复制代码
      dlg.setWindowTitle("Print");
      if( dlg.exec() == QPrintDialog::Accepted )
      {
          //QPrinter()包含打印机名称、纸张大小、分辨率、输出格式
          QPrinter* p = dlg.printer();
          mainEditor.document() -> print(p); //document()返回编辑器内部的 QTextDocument 对象
      }

    }

4.光标位置的计算

  • 文本框对象的内部包含了QTextCursor对象
  • 通过position()成员函数获取当前光标的字符位置
  • 根据光标的字符位置计算横纵坐标
  • 当光标位置发生变化时进行计算

计算行列的算法:

(1)通过换行符来计算行数

(2)通过当前位置-当前行的起始索引获取列数

复制代码
void MainWindow::onCursorPositionChanged()
{
    int pos = mainEditor.textCursor().position();
    QString text = mainEditor.toPlainText();
    int col = 0; //列
    int ln = 0; //行
    int flag = 0;
    for(int i=0; i<pos; i++)
    {
        if(text[i] == '\n')
        {
            ln++;
            flag = i;
        }
    }
    flag++;
    col = pos - flag;
    statusLbl.setText("Ln: " + QString::number(ln+1)+ "    Col: " + QString::number(col+1));
}
相关推荐
故事和你913 小时前
洛谷-【动态规划1】动态规划的引入2
开发语言·数据结构·c++·算法·动态规划·图论
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第71题】【Mysql篇】第1题:索引是什么?
java·开发语言·b树·mysql·面试
九皇叔叔3 小时前
VMware 安装 麒麟操作系统
java·开发语言·虚拟机·麒麟操作系统·vmware安装
weixin199701080164 小时前
[特殊字符] 人工抓取数据革命:从“人肉爬虫”到“智能数据工厂”全面转型指南
开发语言·爬虫·python
一行代码一行诗++4 小时前
goto语句
java·开发语言·算法
froginwe114 小时前
JSP 日期处理
开发语言
我材不敲代码5 小时前
Python 基础:列表的切片与嵌套列表使用技巧
开发语言·python
彦为君5 小时前
JavaSE-03-集合框架(详细版)
java·开发语言·python
我命由我123455 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime