Qt 富文本处理(11):表格和表格格式

前言

  富文本文档的表格相关类:QTextTable类、QTextTableFormat类、以及 QTextTableCellQTextTableCellFormat 类的层次结构如下图所示:

1

QTextTable类

  QTextTable类表示QTextDocument中的一个表格。主要功能就是用来管理单元格的,具备 插入、合并、分割单元格等功能。

  表格是一组按行和列排序的单元格。每个表至少包含一行和一列。每个单元格包含一个块,并被一个框架包围。
通常使用QTextCursor::insertTable()函数创建并插入文档中。例如,我们可以在编辑器中使用以下代码在当前游标位置插入一个三行两列的表:

     QTextCursor cursor(editor->textCursor());
     cursor.movePosition(QTextCursor::Start);
     QTextTable *table = cursor.insertTable(rows, columns, tableFormat);

  表格的格式要么在创建表时定义,要么在稍后使用setFormat()修改。

  使用QTextCursor::currentTable()可以找到当前被游标编辑的表。这允许在插入到文档后更改其格式或尺寸。

  可以使用resize()或insertRows()、insertColumns()、removeRows()或removeColumns()来更改表的大小。

  使用cellAt()检索表单元格。

  通过在表中移动游标,并使用rowStart()和rowEnd()函数在每一行的开始和结束处获取游标,可以找到表行的起始和结束位置。

  可以使用mergeCells()和splitCell()函数合并和拆分QTextTable中的行和列。但是,只有跨多行或多列的单元格可以拆分。(合并或拆分不会增加或减少行和列的数量。)

  请注意,如果将多个列和行合并到一个单元格中,则不能将合并的单元格拆分为跨越多个行或列的新单元格。为了能够跨几行和几列拆分单元格,您需要在多次迭代中完成此操作。

  假设我们有一个包含姓名和地址的2x3表。为了合并第一行中的两列,我们调用mergeCells(),其中row = 0、column = 0、numRows = 1和numColumns = 2。
  table->mergeCells(0, 0, 1, 2);
  这给了我们下表。为了将表的第一行分割回两个单元格,我们使用numRows和numCols = 1调用splitCell()函数。
 table->splitCell(0, 0, 1, 1);
  这样就得到了原始表。

QTextTableFormat类

  QTextTableFormat类提供QTextDocument中表格的格式设置信息。

  表格是一组按行和列排序的单元格。每个表格至少包含一行和一列。每个单元格包含一个。富文本文档中的表格使用定义的属性进行格式化。

  根据表格的对齐方式,表格在父框架内水平对齐。可以使用alignment()函数读取并使用setAlignment()函数进行设置。

  表格中的单元格由单元格间距分隔。用setCellSpacing()设置单元格之间的像素数,用cellSpacing()读取。每个单元格的内容被单元格填充包围。每个单元格边缘与其内容之间的像素数是用setCellPadding()设置的,用cellPadding()读取的。

  表的背景颜色可以用background()函数读取,也可以用setBackground()指定。每个单元格的背景颜色可以独立设置,并将控制填充区域内单元格的颜色。

  表格式还提供了一种约束表中列的宽度的方法。可以为列分配固定的宽度、可变的宽度或可用宽度的百分比(参见QTextLength)。columns()函数返回具有约束的列数,而columnWidthConstraints()函数返回为表定义的约束。这些数量也可以通过使用包含新约束的向量调用setColumnWidthConstraints()来设置。如果不需要任何约束,clearColumnWidthConstraints()可以用来删除它们。

  setBorderCollapse()函数可以设置是否让表格的边框和网格按照CSS表格的border-collapse的折叠规则进行渲染。

QTextTableCell 类

  QTextTableCell类表示QTextTable中单元格的属性。

  表格单元是属于表格的文档结构。 该表将单元格按特定的行和列排序; 单元还可以跨越多个列和行。

  通常在使用QTextCursor :: insertTable()将表插入文档中时创建单元格,但是在调整表大小时也会创建和销毁它们。

  单元格包含有关其在表中位置的信息; 您可以获得单元格的row()和column()编号,以及其rowSpan()和columnSpan()。

  单元格的format()描述其内容的默认字符格式。 firstCursorPosition()和lastCursorPosition()函数用于获取文档中单元格的范围。

QTextTableCellFormat 类

  QTextTableCellFormat类为QTextDocument中的表格单元格提供格式化信息。

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

  表格单元格的填充属性由setLeftPadding()、setRightPadding()、setTopPadding()和setBottomPadding()控制。所有的paddings都可以使用setPadding()一次性设置。

代码示例

主要代码如下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    edit = new QTextEdit;
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(edit);
    resize(600,400);

    QTextDocument *doc = edit->document();  //获取文本文档
    QFont font("楷体",12);
    doc->setDefaultFont(font);      //设置文本文档的默认字体

    //通过文本编辑器获取当前文本光标
    QTextCursor cursor = edit->textCursor();
    int row = 4;
    int col = 3;

    //通过光标插入表格
    QTextTable *table =  cursor.insertTable(row,col);

    //获取表格的格式
    QTextTableFormat tableFormat = table->format();
    //表格格式设置宽度
    tableFormat.setWidth(QTextLength(QTextLength::FixedLength,edit->width()-100));
    //表格格式设置启用BorderCollapse
    tableFormat.setBorderCollapse(true);

    //设置表格的columnWidthConstraints约束
    QVector<QTextLength> colLength = tableFormat.columnWidthConstraints();
    for (int i = 0; i < col; ++i) {
        colLength.append(QTextLength(QTextLength::FixedLength,tableFormat.width().rawValue()/col));
    }
    tableFormat.setColumnWidthConstraints(colLength);
    tableFormat.setBorder(5);
    tableFormat.setBorderBrush(Qt::black);


    //定义单元格格式
    QTextTableCellFormat cellFormat;
    cellFormat.setBottomBorderStyle(QTextFrameFormat::BorderStyle_Solid);
    cellFormat.setBottomBorder(2);
    cellFormat.setBottomBorderBrush(Qt::red);
    cellFormat.setBackground(QColor("moccasin"));

    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            QTextTableCell cell = table->cellAt(i,j);
            if(i == 0)
            {
                cell.setFormat(cellFormat);
            }
            QString str = QString::number(i * col + j + 1);
            QTextCursor cellCursor = cell.firstCursorPosition();
            QTextBlockFormat cellBlockFormat = cellCursor.blockFormat();
            cellBlockFormat.setProperty(QTextFormat::BlockAlignment,Qt::AlignCenter);
            cellCursor.setBlockFormat(cellBlockFormat);
            cellCursor.insertText(str);
        }
    }

    table->setFormat(tableFormat);
}

总结

  QTextTable和QTextTableFormat的运用比较简单,QTextTableCell 和 QTextTableCellFormat的格式有点复杂,设置单元格内容的对齐,需要使用QTextBlockFormat 的对齐格式。内容其实不算多,思路还可以进一步梳理,案例中没有给出合并、分隔、插入、删除单元格的操作。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值