富文本编辑器(添加表格)

本文详细介绍了如何在Qt的QTextEdit中使用QTextCursor和QTextTable插入表格,包括设置对齐、间距、列宽约束,以及表格单元格的合并、分割和格式化。实例演示了合并2行4列和3列的表格操作。
摘要由CSDN通过智能技术生成

使用QTextCursor添加表格列表和图片。

QTextTableFromat (表格格式)

构造函数:

 常用的函数:

setAlignment()设置对齐方式
setCellSpacing()设置单元格之间的间距
setCellPadding(0设置单元格填充
setBackground()设置背景颜色
setBorderCollapse()设置边框折叠
setColumns()设置列数

setColumnWidthConstraint()

设置列宽约束
isValid()列表格式是否合规

添加表格使用:cursor.insertTable(x,y,tebleFormat) 

  • x 为行数
  • y 为列数
  • tableFromat 为表的格式

例子:在textEdit中添加一个表格

    //添加一个表格
    QTextCursor cursor=document->rootFrame()->lastCursorPosition();//获取最后的位置
    QTextTableFormat table;
    table.setAlignment(Qt::AlignLeft);//左边
    table.setCellPadding(10);//设置填充
    table.setCellSpacing(1);//设置间隔
    //用一个textTable 接收插入的表格
    QTextTable *texttable=cursor.insertTable(5,5,table);//插入一个表格

 设置列宽约束:

 设置列宽约束:需要使用容器来存放每列的约束

    //添加一个表格
    QTextCursor cursor=document->rootFrame()->lastCursorPosition();//获取最后的位置
    QTextTableFormat table;
    table.setAlignment(Qt::AlignLeft);//左边
    table.setCellPadding(10);//设置填充
    table.setCellSpacing(1);//设置间隔
    QVector<QTextLength> length;//创建一个容器存放列限制
    for(int i=0;i<5;i++)
    {
        length.append(QTextLength(QTextLength::FixedLength,50));
    }
    table.setColumnWidthConstraints(length);//设置列限制
    QTextTable *texttable=cursor.insertTable(5,5,table);//插入一个表格

 QTextTable(文本表格)

常用的函数:

setFromat()

设置表格格式
rows()行数

rowStart(),rowEnd()

开始的游标,结束的游标
resize()调整表的结构
removeRows(),removeColumns()删除行数,列数
mergeCells()合并单元表格
insertRows(),insertColumns()插入行数和列数

appendRows(),appendColumns()

追加行、列
splitCell()拆分单元格
cellAt()返回指定位置的单元格

合并表格:

mergeCells(row,column,numRows,numColumns )行和列都从0开始

  • row        起始行
  • column  起始列
  • numRows  需要合并的行数
  • numColumns 需要合并的列数

 例子1:从0,0开始,合并2行4列

    texttable->mergeCells(0,0,2,4);//0,0开始合并两行四列

例子2:从1,1开始,合并2行3列

    texttable->mergeCells(1,1,2,3);//1,1开始合并2行3列

 分割表格:

splitCell(row,column,numRows,numColumns)

  • row        起始行
  • column  起始列
  • numRows  需要分割成的行数
  • numColumns 需要分割成的列数

原始表格为:

合并成3列

texttable->mergeCells(0,0,2,4);    
texttable->splitCell(0,0,1,3);//0,0开始分割1行,分割成3列

 还原成原来的完整表格:

texttable->mergeCells(0,0,2,4);    
texttable->splitCell(0,0,1,1);//分割成 1行 1列

 QTextTableCell(表格单元格)

表格单元格是属于表格的文档结构片段。该表将单元格排序为特定的行和列;单元格还可以跨越多列和多行。单元格通常在使用QTextCursor::insertTable() 插入文档时创建,但也会在调整表格大小时创建和销毁。

构造函数:

常用的函数:

fristCursorPosition()第一个有效的光标位置
lastCursorPosition()最后一个有效的光标位置
row()行号
column()列号

QTextTableCellFromat(表格单元格样式)

文档中表格单元格的表格单元格格式指定表格单元格的可视属性

这些样式都大致相同就不列举了

QTextTableCellFormat Class |Qt GUI 5.15.11

来个例子:

widget.h文件添加以下数据

头文件:

#include<QTextEdit>
#include<QTextTable>
#include<QTextCursor>
#include<QTextDocument>
#include<QTextTableCell>
#include<QDebug>

成员函数和成员变量:

    QTextEdit *textedit;//文本框
    int row;//行数
    int column;//列数
    void mergeCells(QTextTable*table,int a,int b,int c,int d);//合并表格
    void splitCalls(QTextTable*table,int a=0,int b=0,int c=1,int d=1);//分割表格
    void setTextLength(QTextTable *table,QTextTableFormat &p);//添加列限制
    void setTableCellformat(QTextTable *table);//添加表格块格式和数据
    void showtext(QTextTable *table);//输出全部内容

构造函数的内容:

    resize(800,800);
    textedit=new QTextEdit(this);
    textedit->setFixedSize(500,500);//设置文本框大小
    textedit->move(100,100);//移动文本框位置
    QTextDocument *document=textedit->document();//获取文本
    document->setDefaultFont(QFont("宋体",12));//设置默认字体和字体大小
    QTextCursor cursor=textedit->textCursor();//获得文本当前光标位置
    QTextTableFormat tablefromat;
    tablefromat.setAlignment(Qt::AlignLeft);//放到最左边
    tablefromat.setCellPadding(10);//设置填充
    tablefromat.setCellSpacing(1);//设置边距
    row=5;//初始为5行
    column=5;//初始为5列
    QTextTable *table=cursor.insertTable(row,column,tablefromat);//插入一个表格,并用table接收
    //setTextLength(table,tablefromat);//添加列限制
    setTableCellformat(table);//添加格式和添加数据
    //mergeCells(table,0,0,2,4);//合并表格
    //splitCalls(table);//分割表格,有默认值,默认恢复原状
    //showtext(table);//显示表格中的全部数据

函数的实现:

 void Widget::setTextLength(QTextTable *table,QTextTableFormat &p)//添加列限制
 {

     QVector<QTextLength> textlength;
     for(int i=0;i<table->columns();i++)
     {
         textlength.append(QTextLength(QTextLength::PercentageLength,80));
     }
     p.setColumnWidthConstraints(textlength);
     table->setFormat(p);
 }
 void Widget::mergeCells(QTextTable* table,int a,int b,int c,int d)//合并表格
 {
     if(a<0||a>table->rows()-1)
     {
         return;
     }
     if(b<0||b>table->rows()-1)
     {
         return;
     }
     if(c<0||c>table->rows())
     {
         return;
     }
     if(d<0||d>table->rows())
     {
         return;
     }
     table->mergeCells(a,b,c,d);//合并表格
 }
 void Widget::splitCalls(QTextTable* table,int a,int b,int c,int d)//分割表格
 {
     if(a<0||a>table->rows()-1)
     {
         return;
     }
     if(b<0||b>table->columns()-1)
     {
         return;
     }
     if(c<0||c>table->rows())
     {
         return;
     }
     if(d<0||d>table->columns())
     {
         return;
     }
     table->splitCell(a,b,c,d);//分割表格
 }
 void Widget::setTableCellformat(QTextTable *table)//添加表格块格式和添加数据
 {
     QTextTableCellFormat cellFormat;//表格块格式
     cellFormat.setPadding(1);//填充
     cellFormat.setFont(QFont("楷书",10));//设置字体和大小
     cellFormat.setBackground(Qt::white);//设置背景
     for(int i=0;i<table->rows();i++)
     {
         for(int j=0;j<table->columns();j++)
         {
             QTextTableCell cell=table->cellAt(i,j);//获取位置的表格块
             cell.setFormat(cellFormat);
             QTextCursor cursor=cell.firstCursorPosition();//获取光标位置
             cursor.insertText("table");//插入数据
         }

     }
 }
void Widget::showtext(QTextTable *table)//输出全部内容
{
    for(int i=0;i<table->rows();i++)
    {
        for(int j=0;j<table->columns();j++)
        {
            QTextTableCell cell=table->cellAt(i,j);
            QTextCursor cursor=cell.firstCursorPosition();//获取光标初始位置
            QTextBlock block=cursor.block();//获取当前的文本块
            qDebug()<<block.text();//输出内容
        }
    }
}

页面效果:

 功能的话在这就不展示了,我这是可以运行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值