COMPASSi/trunk/code/3rd/CCSReport/include/ccstemplateitem.h

2035 lines
70 KiB
C
Raw Normal View History

2025-06-25 15:06:42 +08:00
#ifndef CCSTEMPLATEITEM_H
#define CCSTEMPLATEITEM_H
#include "ccstemplatebase.h"
#include <QHash>
#include <QMargins>
#include "QColor"
#include "QFont"
#include "QMap"
#include "QPen"
#include "common_types.h"
namespace CCS_Report {
/// <summary>
/// 页属性格式定义,【暂时未用】
/// </summary>
class PageFormat:public BaseFormat
{
public:
PageFormat():BaseFormat(){}
PageFormat(const QColor& color,const int& orient,const qreal& top,const qreal& bottom,const qreal& left,const qreal& right):BaseFormat()
{
m_Color = color;
m_Orientation = orient;
m_PageTop = top;
m_PageBottom = bottom;
m_PageLeft = left;
m_PageRight = right;
}
PageFormat(const qreal& top,const qreal& bottom,const qreal& left,const qreal& right):BaseFormat()
{
m_Color = QColor(Qt::white);
m_Orientation = 0;
m_PageTop = top;
m_PageBottom = bottom;
m_PageLeft = left;
m_PageRight = right;
}
PageFormat(PageFormat& format):BaseFormat()
{
m_Color = format.m_Color;
m_Orientation = format.m_Orientation;
m_PageTop = format.m_PageTop;
m_PageBottom = format.m_PageBottom;
m_PageLeft = format.m_PageLeft;
m_PageRight = format.m_PageRight;
}
~PageFormat(){}
inline QColor color() const {return m_Color;}
inline void SetColor(const QColor& color){m_Color = color;}
qreal pagetop() const {return m_PageTop;}
qreal pagebottom() const {return m_PageBottom;}
qreal pageleft() const {return m_PageLeft;}
qreal pageright() const {return m_PageRight;}
int orientation() const {return m_Orientation;}
void SetPageTop(qreal& top){m_PageTop = top;}
void SetPageBottom(qreal & bottom){m_PageBottom = bottom;}
void SetPageLeft(qreal &left) {m_PageLeft = left;}
void SetPageRight(qreal &right){m_PageRight = right;}
void SetOrientation(int &orient){m_Orientation = orient;}
private:
QColor m_Color; //页的背景色
qreal m_PageTop; //页边距 上,如果有页眉,在实现时,当小于页眉高度,则以页眉为准
qreal m_PageBottom;//页边距 下;距底端距离 如果有页脚 在代码实现时 如果页脚高度大于此值,则以页脚为准
qreal m_PageLeft;//页边距 左 跟边框没有关系
qreal m_PageRight; //页边距 右 跟边框没有关系
QMargins m_margin;
int m_Orientation; //页方向;纵向、横向
};
/// <summary>
/// 元素页类定义
/// </summary>
class Page:public BaseItem
{
public:
Page():BaseItem("")
{
m_Format = new PageFormat();
m_Type = classtype::Page;
}
Page(const qreal& top,const qreal& bottom,const qreal& left,const qreal& right,QString name=""):BaseItem(name)
{
m_Format = new PageFormat(top,bottom,left,right);
m_Type = classtype::Page;
}
Page(PageFormat& format)
{
m_Format = new PageFormat(format);
m_Type = classtype::Page;
}
Page(const Page& page)
{
PageFormat* pF = dynamic_cast<PageFormat*>(page.m_Format);
m_Format = new PageFormat(*pF);
m_Name = page.m_Name;
m_Type = classtype::Page;
}
Page& operator= (const Page& page) {
PageFormat* pF = dynamic_cast<PageFormat*>(page.m_Format);
if (m_Format != nullptr){delete m_Format;}
m_Format = new PageFormat(*pF);
m_Name = page.m_Name;
m_Type = page.m_Type;
}
private:
};
/// <summary>
/// 文本属性类
/// </summary>
class TextFormat:public BaseFormat
{
public:
TextFormat():BaseFormat()
{
QFont font= QFont("SimSun",9);
font.setPixelSize(40);
Init(QPen(),font,Qt::AlignVCenter,0,CCSTextWrapType::Letter);
}
TextFormat(const QPen pen,const QFont font,Qt::AlignmentFlag flag):BaseFormat()
{
Init(pen,font,flag,0,CCSTextWrapType::Letter);
}
TextFormat(const QPen pen,const QFont font,Qt::AlignmentFlag flag,int space,CCSTextWrapType::TextWrapFlag wrap=CCSTextWrapType::Letter,bool group=false):BaseFormat()
{
Init(pen,font,flag,space,wrap,group);
}
void Init(QPen pen,QFont font,Qt::AlignmentFlag flag,int space,CCSTextWrapType::TextWrapFlag wrap,bool group=false)
{
m_Pen = pen;
m_Font = font;
m_qAlignCharFormatFlag = flag; // 字符串对齐方式 Qt::AlignTop,Qt::AlignBottom,Qt::AlignVCenter
m_iAddFirstSpaceFlag =space; // =0 不加空格
m_iWrapFlag = wrap;
m_bGroup = group;
m_qAngle = 0;
m_Color = Qt::black;
}
TextFormat(const TextFormat& textF)
{
m_Pen = textF.m_Pen;
m_Font = textF.m_Font;
m_qAlignCharFormatFlag =textF.m_qAlignCharFormatFlag; // 字符串对齐方式 Qt::AlignTop,Qt::AlignBottom,Qt::AlignVCenter
m_iAddFirstSpaceFlag = textF.m_iAddFirstSpaceFlag; // =0 不加空格
m_iWrapFlag = textF.m_iWrapFlag;
m_bGroup = textF.m_bGroup;
m_qAngle = textF.m_qAngle;
m_Color = textF.m_Color;
}
TextFormat& operator= (const TextFormat& textF) {
m_Pen = textF.m_Pen;
m_Font = textF.m_Font;
m_qAlignCharFormatFlag =textF.m_qAlignCharFormatFlag; // 字符串对齐方式 Qt::AlignTop,Qt::AlignBottom,Qt::AlignVCenter
m_iAddFirstSpaceFlag = textF.m_iAddFirstSpaceFlag; // =0 不加空格
m_iWrapFlag = textF.m_iWrapFlag;
m_bGroup = textF.m_bGroup;
m_qAngle = textF.m_qAngle;
m_Color = textF.m_Color;
return *this;
}
~TextFormat(){}
/// <summary>
/// 文本字体
/// </summary>
/// <returns></returns>
inline QFont font() const {return m_Font;}
inline void SetFont(const QFont & font) {m_Font = font;}
inline QPen pen() const {return m_Pen;}
inline void SetPen(const QPen& pen){m_Pen = pen;}
/// <summary>
/// 字体颜色
/// </summary>
/// <returns></returns>
inline QColor color() const {return m_Color;}
inline void SetColor(const QColor& value){ m_Color = value;}
/// <summary>
/// 设置上、下标标识
/// </summary>
/// <returns></returns>
inline int charformat() const {return m_qAlignCharFormatFlag;}
inline void SetCharFormat(const int& flag){m_qAlignCharFormatFlag = flag;}
/// <summary>
/// 是否加空格 【目前未实现】
/// </summary>
/// <returns></returns>
inline int spaceflag() const {return m_iAddFirstSpaceFlag;}
inline void SetSpaceFlag(int& flag){m_iAddFirstSpaceFlag = flag;}
/// <summary>
/// 文本折行标识;
/// 当文本在一个单元格中的一行显示不下时,进行换行的标识
/// </summary>
/// <returns></returns>
inline CCSTextWrapType::TextWrapFlag wrapflag() const {return m_iWrapFlag;}
inline void SetWrapFlag(CCSTextWrapType::TextWrapFlag& flag){m_iWrapFlag = flag;}
/// <summary>
/// 是否属于某个组 缺省false 只有在定义tablegroup元素时用到此属性
/// </summary>
/// <returns></returns>
inline bool group() const {return m_bGroup;}
inline void SetGroup(bool& flag){m_bGroup = flag;}
/// <summary>
/// 字体角度【目前只支持水印】
/// </summary>
/// <returns></returns>
inline qreal angle() const { return m_qAngle; }
inline void SetAngle(const qreal& value) { m_qAngle = value; }
private:
bool m_bGroup; //是否属于某个组 缺省false 只有在定义tablegroup时用到此属性
int m_iClose; //标识当进行折行时向前一个粘合不能拆分还是后一个不能拆分;缺省 =0 不粘合 =-1 向左边靠近粘合 =1 向右边粘合
int m_qAlignCharFormatFlag = 0; // =0 noraml 字-1 下标 1 上标 符串对齐方式 Qt::AlignTop,Qt::AlignBottom,Qt::AlignVCenter
int m_iAddFirstSpaceFlag = 1; // =0 不加空格
qreal m_height; //高度
qreal m_qAngle;
QPen m_Pen; //包含、宽度、样式
QFont m_Font; //字体、字体大小、加粗、斜体、上划线、下划线、删除线
QColor m_Color; //颜色
CCSTextWrapType::TextWrapFlag m_iWrapFlag = CCSTextWrapType::Word;
};
/// <summary>
///
/// </summary>
class Text:public BaseItem
{
public:
Text():BaseItem("")
{
m_Type = classtype::Text;
m_Format = new TextFormat();
m_strText = "";
}
Text(const QString& content,const QFont& font=QFont(),const Qt::AlignmentFlag scriptflag=Qt::AlignVCenter,QPen pen=QPen(),
int space=0,CCSTextWrapType::TextWrapFlag wrap=CCSTextWrapType::Letter,bool group=false,QString name=""):BaseItem(name)
{
m_Type = classtype::Text;
m_strText = content;
m_Format = new TextFormat(pen,font,scriptflag,space,wrap,group);
}
/*Text(const QString& content,QString name=""):BaseItem(name)
{
m_Type = classtype::Text;
m_strText = content;
m_Format = new TextFormat();
}
Text(const QString& content,const Qt::AlignmentFlag& scriptflag,QString name=""):BaseItem(name)
{
m_Type = classtype::Text;
m_strText = content;
m_Format = new TextFormat();
TextFormat* pF = static_cast<TextFormat*>(m_Format);
pF->SetCharFormat(scriptflag);
}
Text(const QString& content,const QFont& font,int pixelsize,const Qt::AlignmentFlag scriptflag=Qt::AlignVCenter,bool group=false,QString name=""):BaseItem(name)
{
m_Type = classtype::Text;
m_strText = content;
m_Format = new TextFormat(QPen(),font,scriptflag,0,CCSTextWrapType::Letter,pixelsize,group);
}
Text(const QString& content,const QFont& font,int pixelsize,const QPen& pen,const Qt::AlignmentFlag scriptflag=Qt::AlignVCenter,QString name=""):BaseItem(name)
{
m_Type = classtype::Text;
m_strText = content;
m_Format = new TextFormat(pen,font,scriptflag,0,CCSTextWrapType::Letter,pixelsize);
}*/
Text(const QString &content,const TextFormat &format, QString name=""):BaseItem(name)
{
m_Type = classtype::Text;
m_strText = content;
m_Format = new TextFormat(format);
}
Text(const Text& text)
{
m_Type = classtype::Text;
m_strText = text.m_strText;
TextFormat* pF = dynamic_cast<TextFormat*>(text.m_Format);
m_Format = new TextFormat(*pF);
m_Name = text.m_Name;
}
Text& operator= (const Text& text) {
m_Type = text.m_Type;
m_strText = text.m_strText;
TextFormat* pF = dynamic_cast<TextFormat*>(text.m_Format);
if (m_Format != nullptr){delete m_Format;}
m_Format = new TextFormat(*pF);
m_Name = text.m_Name;
return *this;
}
inline QString textvalue() const {return m_strText;}
inline void SetValue(const QString& value){m_strText = value;}
inline void SetFont(const QFont& font)
{
static_cast<TextFormat*>(m_Format)->SetFont(font);
}
private:
QString m_strText;
};
/* 空行*/
class BlankLine:public BaseItem
{
public:
BlankLine():BaseItem()
{
m_Type = classtype::BlankLine;
m_strText = "";
m_Format = new TextFormat(QPen(),QFont(),Qt::AlignVCenter);
m_iLineNum = 1;
}
BlankLine(const QPen& pen,const QFont& font):BaseItem()
{
m_Type = classtype::BlankLine;
m_strText = "";
m_Format = new TextFormat(pen,font,Qt::AlignVCenter);
m_iLineNum = 1;
}
BlankLine(const QPen& pen,const QFont& font,int lineNum):BaseItem()
{
m_Type = classtype::BlankLine;
m_strText = "";
m_Format = new TextFormat(pen,font,Qt::AlignVCenter);
m_iLineNum = lineNum;
}
BlankLine(int lineNum):BaseItem()
{
m_Type = classtype::BlankLine;
m_strText = "";
m_Format = new TextFormat(QPen(),QFont(),Qt::AlignVCenter);
m_iLineNum = lineNum;
}
BlankLine(const BlankLine& blank)
{
m_strText = blank.m_strText;
m_iLineNum = blank.m_iLineNum;
m_Type = classtype::BlankLine;
TextFormat* pF = dynamic_cast<TextFormat*>(blank.m_Format);
m_Format = new TextFormat(*pF);
m_Name = blank.m_Name;
}
private:
QString m_strText;
int m_iLineNum;
};
/// <summary>
/// 图片属性设置
/// </summary>
class ImageFormat:public BaseFormat
{
public:
ImageFormat():BaseFormat()
{
//自适应
Init(CCSImageType::SelfWidth,CCSImageType::SelfHeight,0,0,100,0);//缺省和页边距相同
}
ImageFormat(const CCSImageType::ImageWidthFlag widthmode,const CCSImageType::ImageHeightFlag heightmode=CCSImageType::SelfHeight,const qreal& opacity=100):BaseFormat()
{
Init(widthmode,heightmode,0,0,opacity,0);
}
void Init(const CCSImageType::ImageWidthFlag widthmode,const CCSImageType::ImageHeightFlag heightmode,
const qreal& width,const qreal& height,const qreal& opacity,const int& showmode)
{
m_eWidthMode =widthmode;
m_iWidth = width;//缺省和页边距相同
m_iHeigth = height;
m_opacity = opacity;
m_eShowMode = showmode; //自适应
m_eHeightMode = heightmode;
}
ImageFormat(const ImageFormat& imageF):BaseFormat(imageF)
{
m_eWidthMode = imageF.m_eWidthMode;
m_iWidth = imageF.m_iWidth;
m_iHeigth = imageF.m_iHeigth;
m_opacity = imageF.m_opacity;
m_eShowMode = imageF.m_eShowMode;
m_eHeightMode = imageF.m_eHeightMode;
m_qAngle = imageF.m_qAngle;
}
ImageFormat& operator= (const ImageFormat& imageF) {
m_eWidthMode = imageF.m_eWidthMode;
m_iWidth = imageF.m_iWidth;
m_iHeigth = imageF.m_iHeigth;
m_opacity = imageF.m_opacity;
m_eShowMode = imageF.m_eShowMode;
m_eHeightMode = imageF.m_eHeightMode;
m_qAngle = imageF.m_qAngle;
return *this;
}
~ImageFormat(){}
// inline QFont font() const {return m_Font;}
// inline void SetFont(const QFont & font) {m_Font = font;}
// inline QColor color() const {return m_Color;}
// inline void SetColor(const QColor& color){m_Color = color;}
inline qreal width() const {return m_iWidth;}
inline void SetWidth(const qreal& width){m_iWidth = width;}
inline qreal height() const {return m_iHeigth;}
inline void SetHeight(const qreal& height){m_iHeigth = height;}
inline void SetImageSize(const qreal& width,const qreal& height)
{
m_iWidth = width;
m_iHeigth = height;
}
/// <summary>
/// 透明度【暂未使用】
/// </summary>
/// <returns></returns>
inline qreal opacity() const {return m_opacity;}
inline void SetOpacity(const qreal& opacity){m_opacity = opacity;}
/// <summary>
/// 角度 【暂未实现】
/// </summary>
/// <returns></returns>
inline qreal angle() const {return m_qAngle;}
inline void SetAngle(const qreal& value){ m_qAngle = value;}
/// <summary>
/// 宽度模式设置
/// </summary>
/// <returns></returns>
inline CCSImageType::ImageWidthFlag widthmode() const {return m_eWidthMode;}
inline void SetWidthMode(const CCSImageType::ImageWidthFlag& flag){m_eWidthMode = flag;}
/// <summary>
/// 显示模式,=0 自适应 =1 裁剪
/// </summary>
/// <returns></returns>
inline qreal showmode() const {return m_eShowMode;}
inline void SetShowMode(const int& mode){m_eShowMode = mode;}
/// <summary>
/// 高度模式设置
/// </summary>
/// <returns></returns>
inline CCSImageType::ImageHeightFlag heightmode() const {return m_eHeightMode;}
inline void SetHeightMode(const CCSImageType::ImageHeightFlag& flag){m_eHeightMode = flag;}
private:
// QColor m_Color;
// QFont m_Font;
int m_eShowMode; //显示模式,=0 自适应 =1 裁剪
qreal m_iHeigth;
qreal m_iWidth;
qreal m_opacity; //透明度 0~100 对应0~255 值越大越不透明
CCSImageType::ImageWidthFlag m_eWidthMode; //
CCSImageType::ImageHeightFlag m_eHeightMode; //
qreal m_qAngle;
};
/// <summary>
/// 图片元素类
/// </summary>
class Image:public BaseItem
{
public:
Image():BaseItem("")
{
m_Type = classtype::Image;
m_Format = new ImageFormat();
m_strPath = "";
}
Image(const QString& strPath,QString name=""):BaseItem(name)
{
m_Type = classtype::Image;
m_Format = new ImageFormat();
m_strPath = strPath;
}
// Image(const QString& strPath,qreal& opacity,QString name=""):BaseItem(name)
// {
// m_Type = classtype::Image;
// m_strPath = strPath;
// m_Format = new ImageFormat(opacity);
// }
// Image(const QString& strPath,qreal& width,qreal& height,QString name=""):BaseItem(name)
// {
// m_Type = classtype::Image;
// m_Format = new ImageFormat(width,height);
// m_strPath = strPath;
// }
// Image(const QString& strPath,qreal& width,qreal& height,qreal& opacity,QString name=""):BaseItem(name)
// {
// m_Type = classtype::Image;
// m_Format = new ImageFormat(width,height,opacity);
// m_strPath = strPath;
// }
Image(const QString &strPath,const ImageFormat &format, QString name=""):BaseItem(name)
{
m_Type = classtype::Image;
m_strPath = strPath;
m_Format = new ImageFormat(format);
}
Image(const Image& image)
{
m_Type = classtype::Image;
m_strPath = image.m_strPath;
ImageFormat* pF = dynamic_cast<ImageFormat*>(image.m_Format);
m_Format = new ImageFormat(*pF);
m_Name = image.m_Name;
}
Image& operator= (const Image& image) {
m_strPath = image.m_strPath;
ImageFormat* pF = dynamic_cast<ImageFormat*>(image.m_Format);
if (m_Format != nullptr){delete m_Format;}
m_Format = new ImageFormat(*pF);
m_Name = image.m_Name;
m_Type = image.m_Type;
return *this;
}
inline QString ImagePath() const {return m_strPath;}
inline void SetImagePath(const QString path){m_strPath = path;}
private:
QString m_strPath; //图片路径
};
/// <summary>
/// 段落元素属性类
/// </summary>
class ParagraphFormat:public BaseFormat
{
public:
ParagraphFormat():BaseFormat()
{
Init(0,0,Qt::AlignLeft,QFont(),true,0.0,0.0,0.0);
}
ParagraphFormat(const int grade,QFont font = QFont(),qreal space=0.0,qreal before=0.0,qreal after=0.0,const int indent=0,bool bShow=true,const Qt::Alignment alignment=Qt::AlignLeft):BaseFormat()
{
Init(grade,indent,alignment,font,bShow,space,before,after);
}
ParagraphFormat(qreal space,qreal before,qreal after,const Qt::Alignment alignment=Qt::AlignLeft,const int grade=0,const int indent=0,QFont font=QFont(),bool bShow=true):BaseFormat()
{
Init(grade,indent,alignment,font,bShow,space,before,after);
}
// ParagraphFormat(const int& grade,const qreal& indent,QFont& font,int& pixelsize,qreal& space,qreal& before,qreal& after):BaseFormat()
// {
// Init(grade,indent,Qt::AlignLeft,font,pixelsize,true,space,before,after);
// }
// ParagraphFormat(const qreal& indent,qreal& space,qreal& before,qreal& after):BaseFormat()
// {
// Init(0,indent,Qt::AlignLeft,QFont(),false,space,before,after);
// }
// ParagraphFormat(const int& grade,const qreal& indent):BaseFormat()
// {
// Init(grade,indent,Qt::AlignLeft,QFont(),true,0.0,0.0,0.0);
// }
// ParagraphFormat(const qreal& indent,const Qt::Alignment alignment,const int marginLeft,const int margingRight):BaseFormat(marginLeft,-1,-1,margingRight)
// {
// Init(0,indent,alignment,QFont(),40,true,0.0,0.0,0.0);
// }
// ParagraphFormat(const int& grade,const qreal& indent,const Qt::Alignment alignment,const int marginLeft,const int margingRight):BaseFormat(marginLeft,-1,-1,margingRight)
// {
// Init(grade,indent,alignment,QFont(),40,true,0.0,0.0,0.0);
// }
ParagraphFormat(const ParagraphFormat& paraF):BaseFormat(paraF)
{
m_iGrade = paraF.m_iGrade;
m_iIndent = paraF.m_iIndent;
m_Alignment = paraF.m_Alignment;
m_Font = paraF.m_Font;
m_bShowGrade = paraF.m_bShowGrade;
// m_FontPixelSize = paraF.m_FontPixelSize;
m_qLineSpace = paraF.m_qLineSpace;
m_qDistanceAfter = paraF.m_qDistanceAfter;
m_qDistanceBefore = paraF.m_qDistanceBefore;
}
ParagraphFormat& operator= (const ParagraphFormat& paraF) {
m_iGrade = paraF.m_iGrade;
m_iIndent = paraF.m_iIndent;
m_Alignment = paraF.m_Alignment;
m_Font = paraF.m_Font;
m_bShowGrade = paraF.m_bShowGrade;
//m_FontPixelSize = paraF.m_FontPixelSize;
m_qLineSpace = paraF.m_qLineSpace;
m_qDistanceAfter = paraF.m_qDistanceAfter;
m_qDistanceBefore = paraF.m_qDistanceBefore;
return *this;
}
~ParagraphFormat(){}
void Init(const int grade,const int indent,const Qt::Alignment alignment,
const QFont& font,const bool & bShow,
const qreal line,const qreal before,const qreal after)
{
m_iGrade = grade;
m_iIndent = indent;
m_Alignment = alignment;
m_Font = font;
m_bShowGrade = bShow;
// m_FontPixelSize = size;
m_qLineSpace = line;
m_qDistanceAfter = after;
m_qDistanceBefore = before;
}
/// <summary>
/// 段落级别设置 1~n
/// </summary>
/// <param name="grade"></param>
inline void SetGrade(int &grade){m_iGrade = grade;}
/// <summary>
/// 首行缩进 【暂未使用】
/// </summary>
/// <param name="indent"></param>
inline void SetIndent(int &indent){m_iIndent = indent;}
/// <summary>
/// 位置设置 居左、居右、居中
/// </summary>
/// <param name="align"></param>
inline void SetAlignment(const Qt::Alignment align){m_Alignment = align;}
inline int grade() const {return m_iGrade;}
inline int indent() const {return m_iIndent;}
// inline int marginLeft() const {return m_iMarginLeft;}
// inline int marginRight() const {return m_iMarginRight;}
inline Qt::Alignment alignment() const {return m_Alignment;}
/// <summary>
/// 级别字体设置
/// </summary>
/// <returns></returns>
inline QFont font() const {return m_Font;}
inline void SetFont(const QFont font){m_Font = font;}
/// <summary>
/// 是否显示级别号 true 显示
/// </summary>
/// <returns></returns>
inline bool showgrade() const {return m_bShowGrade;}
inline void SetShowGrade(const bool bShow){m_bShowGrade = bShow;}
/// <summary>
/// 行间距 以像素计
/// </summary>
/// <returns></returns>
inline qreal linespace() const {return m_qLineSpace;}
inline void SetLineSpace(const qreal value){m_qLineSpace = value;}
/// <summary>
/// 段前距离 以像素计
/// </summary>
/// <returns></returns>
inline qreal distancebefore() const {return m_qDistanceBefore;}
inline void SetDistanceBefore(const qreal value){m_qDistanceBefore = value;}
/// <summary>
/// 段后距离 以像素计
/// </summary>
/// <returns></returns>
inline qreal distanceafter() const {return m_qDistanceAfter;}
inline void SetDistanceAfter(const qreal value){m_qDistanceAfter = value;}
private:
int m_iGrade;
int m_iIndent; //首行缩进
Qt::Alignment m_Alignment;
//针对段落设置字体大小不针对Text设置字体以保证在同一段落内的字体相同
QFont m_Font; //级别号的字体大小
// int m_FontPixelSize; //字体像素大小
bool m_bShowGrade;
qreal m_qLineSpace; //行间距 以像素计
qreal m_qDistanceBefore; //段前间距; 以像素计
qreal m_qDistanceAfter; //段前间距; 以像素计
};
/// <summary>
/// 段落元素类;可包含多个文本类或者一个图片类
/// </summary>
/// <param name="image"></param>
/// <param name="format"></param>
/// <param name="name"></param>
/// <returns></returns>
class Paragraph:public BaseItem
{
public:
Paragraph():BaseItem(){
m_Format = new ParagraphFormat();
m_Type = classtype::Paragraph;
}
Paragraph(const ParagraphFormat &format):BaseItem(){
m_Format = new ParagraphFormat(format);
m_Type = classtype::Paragraph;
}
Paragraph(const QString &text,QString name=""):BaseItem(name)
{
Text* pText = new Text(text);
m_Blocks.append(pText);
m_Format = new ParagraphFormat();
m_Type = classtype::Paragraph;
}
Paragraph(const QString &text,const ParagraphFormat &format, QString name=""):BaseItem(name)
{
Text* pText = new Text(text);
m_Blocks.append(pText);
m_Format = new ParagraphFormat(format);
m_Type = classtype::Paragraph;
}
Paragraph(const Text& text,ParagraphFormat& format,QString name=""):BaseItem(name)
{
Text* pText = new Text(text);
m_Blocks.append(pText);
this->m_Format = new ParagraphFormat(format);
m_Type = classtype::Paragraph;
}
Paragraph(const QList<Text*> &texts,ParagraphFormat& format,QString name=""):BaseItem(name)
{
foreach (Text* item, texts) {
Text* text = new Text(*item);
m_Blocks.append(text);
}
this->m_Format = new ParagraphFormat(format);
m_Type = classtype::Paragraph;
}
Paragraph(const Image& image,ParagraphFormat& format,QString name=""):BaseItem(name)
{
Image* pImage = new Image(image);
m_Blocks.append(pImage);
this->m_Format = new ParagraphFormat(format);
m_Type = classtype::Paragraph;
}
Paragraph(const Paragraph& para):BaseItem(para)
{
for(auto item:para.m_Blocks)
{
classtype name = item->elementType();
if (name == classtype::Text)
{
Text* text = new Text(*(dynamic_cast<Text*>(item)));
m_Blocks.append(text);
}
else
{
Image* image = new Image(*(dynamic_cast<Image*>(item)));
m_Blocks.append(image);
}
}
ParagraphFormat* pF = dynamic_cast<ParagraphFormat*>(para.m_Format);
m_Format = new ParagraphFormat(*pF);
m_Type = classtype::Paragraph;
}
Paragraph& operator= (const Paragraph& para) {
for(auto item:para.m_Blocks)
{
QString name = typeid(item).name();
if (name.toLower().contains("text"))
{
Text* text = new Text(*(dynamic_cast<Text*>(item)));
m_Blocks.append(text);
}
else
{
Image* image = new Image(*(dynamic_cast<Image*>(item)));
m_Blocks.append(image);
}
}
ParagraphFormat* pF = dynamic_cast<ParagraphFormat*>(para.m_Format);
if (m_Format != nullptr){delete m_Format;}
m_Format = new ParagraphFormat(*pF);
m_Type = para.m_Type;
}
~Paragraph()
{
for(auto item:m_Blocks)
{
delete item;
}
}
/*在Paragraph中的集合只能是要么Text类型要么是Image类型
*/
inline bool AddText(const Text& item)
{
if (HasImageElement())
{
for(auto item:m_Blocks)
{
delete item;
}
}
Text* text =new Text(item);
m_Blocks.append(text);
}
inline bool AddTexts(const QList<Text> items)
{
if (HasImageElement())
{
for(auto item:m_Blocks)
{
delete item;
}
}
foreach (Text item, items) {
Text* text =new Text(item);
m_Blocks.append(text);
}
return true;
}
/*在Paragraph中的集合只能是要么Text类型要么是Image类型如果是IMage只能是一张图片
*/
inline bool AddImage(const Image& item)
{
for(auto item:m_Blocks)
{
delete item;
}
Image* image =new Image(item);
m_Blocks.append(image);
}
/// <summary>
/// 获取段落中的文本或者图片对象
/// </summary>
/// <returns></returns>
inline QList<BaseItem*> blocks() const{return m_Blocks;}
inline bool HasImageElement()
{
bool flag = false;
for(auto item:m_Blocks)
{
if (item->elementType() == classtype::Text)
{
continue;
}
flag = true;
}
return flag;
}
private:
QList<BaseItem*> m_Blocks;
};
/// <summary>
/// 单元格属性类
/// </summary>
class CellFormat:public BaseFormat
{
public:
CellFormat():BaseFormat()
{
Init(CCSFrame::FrameAll,QPen(),Qt::AlignLeft,QColor(255,255,255,255),1,1,0, 0,0.0,false,false,false);
}
CellFormat(int rowIndex,int colIndex,CCSFrame::FrameFlags frames=CCSFrame::FrameAll,Qt::Alignment alignment=Qt::AlignCenter,
int rowspan=1,int colspan=1,qreal padding=0,bool dynamic=false,bool merge = false,bool tranrow = false):BaseFormat()
{
Init(frames,QPen(),alignment,QColor(),rowspan,colspan,rowIndex, colIndex,padding,dynamic,merge,tranrow);
}
void Init(CCSFrame::FrameFlags frames,QPen pen,Qt::Alignment alignment,QColor backcolor,
int rowspan,int colspan,int rowIndex,int colIndex,qreal padding,bool dynamic=false,bool merge = false,bool tranrow = false)
{
m_Frame = frames;
m_FramePen = pen;
m_Alignment = alignment;
m_BackColor = backcolor;
m_bBackColor = false;
m_iRowSpan = rowspan;
m_iColSpan = colspan;
m_iRowIndex = rowIndex;
m_iColumnIndex = colIndex;
m_bDynamic = dynamic;
m_bTranRow = tranrow;
m_bMerge = merge;
m_bGroup = false;
m_bBreakRow = false;
m_bRepeat = false;
m_qPadding = padding;
}
// CellFormat(int frames,QPen pen,Qt::Alignment alignment,QColor backcolor,
// int rowspan,int colspan,int rowIndex,int colIndex):BaseFormat()
// {
// m_Frame = frames;
// m_FramePen = pen;
// m_Alignment = alignment;
// m_BackColor = backcolor;
// m_bBackColor = false;
// m_qPadding = 0;
// m_qSpacing = 0;
// m_iRowSpan = rowspan;
// m_iColSpan = colspan;
// m_iRowIndex = rowIndex;
// m_iColumnIndex = colIndex;
// m_bDynamic = false;
// m_bTranRow = false;
// m_bMerge = false;
// }
CellFormat(const CellFormat& cellF):BaseFormat(cellF)
{
m_Frame = cellF.m_Frame;
m_FramePen = cellF.m_FramePen;
m_Alignment = cellF.m_Alignment;
m_BackColor = cellF.m_BackColor;
m_bBackColor = cellF.m_bBackColor;
m_iRowSpan = cellF.m_iRowSpan;
m_iColSpan = cellF.m_iColSpan;
m_iRowIndex = cellF.m_iRowIndex;
m_iColumnIndex = cellF.m_iColumnIndex;
m_bDynamic = cellF.m_bDynamic;
m_bTranRow = cellF.m_bTranRow;
m_bMerge = cellF.m_bMerge;
m_bGroup = cellF.m_bGroup;
m_bBreakRow = cellF.m_bBreakRow;
m_bRepeat = cellF.m_bRepeat;
m_qPadding = cellF.m_qPadding;
}
CellFormat& operator= (const CellFormat& cellF) {
m_Frame = cellF.m_Frame;
m_FramePen = cellF.m_FramePen;
m_Alignment = cellF.m_Alignment;
m_BackColor = cellF.m_BackColor;
m_bBackColor = cellF.m_bBackColor;
m_iRowSpan = cellF.m_iRowSpan;
m_iColSpan = cellF.m_iColSpan;
m_iRowIndex = cellF.m_iRowIndex;
m_iColumnIndex = cellF.m_iColumnIndex;
m_bDynamic = cellF.m_bDynamic;
m_bTranRow = cellF.m_bTranRow;
m_bMerge = cellF.m_bMerge;
m_bGroup = cellF.m_bGroup;
m_bBreakRow = cellF.m_bBreakRow;
m_bRepeat = cellF.m_bRepeat;
m_qPadding = cellF.m_qPadding;
return *this;
}
/// <summary>
/// 是否有边框
/// </summary>
/// <param name="frame"></param>
inline void SetFrame(const CCSFrame::FrameFlags frame){m_Frame = frame;}
inline CCSFrame::FrameFlags frame() const {return m_Frame;}
/// <summary>
/// 边框样式
/// </summary>
/// <param name="pen"></param>
inline void SetFramePen(const QPen& pen){m_FramePen = pen;}
inline QPen framepen() const {return m_FramePen;}
/// <summary>
/// 单元格背景色
/// </summary>
/// <param name="color"></param>
inline void SetBackColor(const QColor& color) {m_BackColor = color;}
inline QColor backColor() const {return m_BackColor;}
/// <summary>
/// 【未用】
/// </summary>
/// <param name="flag"></param>
inline void SetIfHasBackColor(bool &flag){m_bBackColor = flag;}
inline bool ifhasbackcolor(){return m_bBackColor;}
/// <summary>
/// 设置跨行个数
/// 此属性一般用于表格中的列头
/// </summary>
/// <param name="span"></param>
inline void SetRowSpan(const int& span){m_iRowSpan = span;}
inline int rowSpan() const {return m_iRowSpan;}
/// <summary>
/// 设置跨列个数
/// 此属性一般用于表格中的列头
/// </summary>
/// <param name="span"></param>
inline void SetColSpan(const int& span){m_iColSpan = span;}
inline int colSpan() const {return m_iColSpan;}
/// <summary>
/// 单元格内容的位置:居左、居右、居中
/// </summary>
/// <returns></returns>
inline Qt::Alignment alignment() const {return m_Alignment;}
inline void SetAlignment(const Qt::Alignment align){m_Alignment = align;}
/// <summary>
/// 设置行、列
/// </summary>
/// <param name="row"></param>
/// <param name="column"></param>
inline void SetRowColumn(int row,int column)
{
m_iRowIndex = row;
m_iColumnIndex = column;
}
/// <summary>
/// 行索引
/// </summary>
/// <returns></returns>
inline int rowIndex() const {return m_iRowIndex;}
/// <summary>
/// 列索引
/// </summary>
/// <returns></returns>
inline int colIndex() const {return m_iColumnIndex;}
/// <summary>
/// 是否为动态单元格;动态单元格是指此单元格中的数据根据用户设定的数据的多少确定,动态扩展列;
/// 此属性一般用于表格中的列头
/// </summary>
/// <param name="bDynamic"></param>
inline void SetDynamic(const bool bDynamic) { m_bDynamic = bDynamic;}
inline bool dynamic() const {return m_bDynamic;}
/// <summary>
/// 当上下行内容相同时,是否合并
/// 此属性一般用于表格中的内容列
/// </summary>
/// <param name="bMerge"></param>
inline void SetMerge(const bool bMerge) { m_bMerge = bMerge;}
inline bool merge() const {return m_bMerge;}
/// <summary>
/// 是否为转置单元格
/// </summary>
/// <param name="bTranRow"></param>
inline void SetTranRow(bool bTranRow) {m_bTranRow = bTranRow;}
inline bool tranrow() const {return m_bTranRow;}
/// <summary>
/// 是否属于表组;【暂未使用】
/// </summary>
/// <param name="bFlag"></param>
inline void SetGroup(bool bFlag) {m_bGroup = bFlag;}
inline bool group() const {return m_bGroup;}
/// <summary>
/// 折行标志 此单元格列是否为折行如果为true则折行显示
/// </summary>
/// <param name="bFlag"></param>
inline void SetBreakRow(bool bFlag) {m_bBreakRow = bFlag;}
inline bool breakrow() const {return m_bBreakRow;}
/// <summary>
/// 此单元格列在折行时是否重复出现
/// 此属性一般用于表格中的列头
/// </summary>
/// <param name="bFlag"></param>
inline void SetRepeatShow(bool bFlag) {m_bRepeat = bFlag;}
inline bool repeatshow() const {return m_bRepeat;}
/// <summary>
/// 单元格边距
/// </summary>
/// <param name="padding"></param>
inline void SetPadding(const qreal& padding){m_qPadding = padding;}
inline qreal padding() const {return m_qPadding;}
private:
int m_iRowIndex; //第几行 从0行开始计
int m_iColumnIndex; //第几列 从0列开始计
int m_iRowSpan;
int m_iColSpan;
bool m_bBackColor; //考虑Table有背景色
bool m_bDynamic; //动态列
bool m_bTranRow; //当表为转置表时使用说明转置时此单元格是否占一行还是按正常方式进行转置缺省false
bool m_bMerge; //当相邻行两个相等时,是否合并,针对动态表
bool m_bGroup; //当定义的是group时cell的绑定数据是否为group中的循环值还是固定值缺省为固定值false
bool m_bBreakRow; //是否折行缺省false
bool m_bRepeat; //折行时,是否重复出现
qreal m_qPadding; //单元格边距
CCSFrame::FrameFlags m_Frame; //边框设置 上边框、下边框、左边框、右边框
QPen m_FramePen; //边框属性设置,颜色、宽度、样式 ;宽度是像素 大于等于1
QColor m_BackColor; //单元格的背景色如果Table有背景色设置Table背景色如果此Cell有背景色优先Cell背景色
Qt::Alignment m_Alignment; //居左、居右、居中等 包含Paragraph时如果Cell未设置则把Paragraph的align给Cell
};
/// <summary>
/// 单元格元素类; 包含一个段落
/// </summary>
class Cell:public BaseItem
{
public:
Cell():BaseItem(){
m_Format = new CellFormat();
m_Type = classtype::Cell;
}
Cell(const CellFormat& format):BaseItem()
{
m_Format = new CellFormat(format);
m_Type = classtype::Cell;
}
Cell(const Paragraph& paras,const CellFormat& format)
{
m_Type = classtype::Cell;
m_Format = new CellFormat(format);
m_Paragraph =new Paragraph(paras);
}
Cell(const QList<Text*>& texts,const CellFormat& format)
{
m_Type = classtype::Cell;
m_Format = new CellFormat(format);
ParagraphFormat f;
m_Paragraph = new Paragraph(texts,f);
}
Cell(const Text& text,const CellFormat& format)
{
m_Type = classtype::Cell;
m_Format = new CellFormat(format);
ParagraphFormat f;
m_Paragraph = new Paragraph(text,f);
}
Cell(const QString& content,const CellFormat& format)
{
m_Type = classtype::Cell;
m_Format = new CellFormat(format);
m_Paragraph =new Paragraph(content);
}
Cell(const Paragraph& paras,int row,int column,CCSFrame::FrameFlags frames=CCSFrame::FrameAll,Qt::Alignment alignment=Qt::AlignCenter,
int rowspan=1,int colspan = 1,QPen pen=QPen(),QColor color = QColor(255,255,255,255)):BaseItem()
{
m_Type = classtype::Cell;
m_Paragraph =new Paragraph(paras);
CellFormat *format = new CellFormat(row,column,frames,alignment,rowspan,colspan);
format->SetBackColor(color);
this->m_Format = format;
}
// Cell(const Paragraph& paras,int row,int column,QPen pen,int frames=0,Qt::Alignment alignment=Qt::AlignCenter,
// int rowspan=1,int colspan = 1,QColor color = QColor(255,255,255,255)):BaseItem()
// {
// m_Paragraph =new Paragraph(paras);
// CellFormat *format = new CellFormat(frames,pen,alignment,color,rowspan,colspan,row,column);
// this->m_Format = format;
// m_Type = classtype::Cell;
// }
// Cell(QString& content,int row,int column,QPen pen,CCSFrame::FrameFlags frames=CCSFrame::FrameAll,Qt::Alignment alignment=Qt::AlignCenter,
// int rowspan=1,int colspan = 1,QColor color = QColor(255,255,255,255)):BaseItem()
// {
// m_Type = classtype::Cell;
// m_Paragraph =new Paragraph(content);
// CellFormat *format = new CellFormat(frames,pen,alignment,color,rowspan,colspan,row,column);
// this->m_Format = format;
// }
Cell(QString& content,int row,int column,QFont font=QFont(),CCSFrame::FrameFlags frames=CCSFrame::FrameAll,Qt::Alignment alignment=Qt::AlignCenter,
int rowspan=1,int colspan = 1,QPen pen=QPen(),QColor color = QColor(255,255,255,255)):BaseItem()
{
m_Type = classtype::Cell;
Text text(content,font);
ParagraphFormat f =ParagraphFormat();
m_Paragraph =new Paragraph(text,f);
CellFormat *format = new CellFormat(row,column,frames,alignment,rowspan,colspan);
format->SetFramePen(pen);
format->SetBackColor(color);
m_Format = format;
}
Cell(QList<Text*>& texts,int row,int column,CCSFrame::FrameFlags frames=CCSFrame::FrameAll,Qt::Alignment alignment=Qt::AlignCenter,
int rowspan=1,int colspan = 1,QPen pen=QPen(),QColor color = QColor(255,255,255,255)):BaseItem()
{
m_Type = classtype::Cell;
ParagraphFormat f;
m_Paragraph = new Paragraph(texts,f);
CellFormat *format = new CellFormat(row,column,frames,alignment,rowspan,colspan);
format->SetFramePen(pen);
format->SetBackColor(color);
m_Format = format;
}
Cell(const Text& text,int row,int column,CCSFrame::FrameFlags frames=CCSFrame::FrameAll,Qt::Alignment alignment=Qt::AlignCenter,
int rowspan=1,int colspan = 1,qreal padding=0,QPen pen=QPen(),QColor color = QColor(255,255,255,255)):BaseItem()
{
m_Type = classtype::Cell;
ParagraphFormat f;
m_Paragraph = new Paragraph(text,f);
CellFormat *format = new CellFormat(row,column,frames,alignment,rowspan,colspan);
format->SetPadding(padding);
format->SetFramePen(pen);
format->SetBackColor(color);
m_Format = format;
}
// Cell(const Text& text,int row,int column,qreal padding,CCSFrame::FrameFlags frames=CCSFrame::FrameAll,Qt::Alignment alignment=Qt::AlignCenter,
// int rowspan=1,int colspan = 1,QColor color = QColor(255,255,255,255)):BaseItem()
// {
// ParagraphFormat f;
// m_Paragraph = new Paragraph(text,f);
// m_Format = new CellFormat(frames,QPen(),alignment,color,rowspan,colspan,row,column,padding);
// m_Type = classtype::Cell;
// }
Cell(const Image& image,int row,int column,CCSFrame::FrameFlags frames=CCSFrame::FrameAll,Qt::Alignment alignment=Qt::AlignCenter,
int rowspan=1,int colspan = 1,qreal padding=0,QPen pen=QPen(),QColor color = QColor(255,255,255,255)):BaseItem()
{
m_Type = classtype::Cell;
ParagraphFormat f;
m_Paragraph = new Paragraph(image,f);
CellFormat *format = new CellFormat(row,column,frames,alignment,rowspan,colspan);
format->SetFramePen(pen);
format->SetBackColor(color);
m_Format = format;
}
Cell(const Cell& cell):BaseItem(cell)
{
m_Paragraph = new Paragraph(*(cell.paragraph()));
CellFormat* pF = dynamic_cast<CellFormat*>(cell.m_Format);
m_Format = new CellFormat(*pF);
m_Type = classtype::Cell;
}
Cell& operator= (const Cell& cell) {
m_Paragraph = new Paragraph(*(cell.paragraph()));
CellFormat* pF = dynamic_cast<CellFormat*>(cell.m_Format);
if (m_Format != nullptr) {delete m_Format;}
m_Format = new CellFormat(*pF);
m_Type = cell.m_Type;
return *this;
}
~Cell()
{
delete m_Paragraph;
}
void AddParagraph(const Paragraph& para)
{
m_Paragraph = new Paragraph(para);
}
void AddText(const Text& text)
{
//后续初始化时要填属性 format
m_Paragraph->AddText(text);
}
void AddTexts(QList<Text>& text)
{
m_Paragraph->AddTexts(text);
}
/// <summary>
/// 获取包含的段落对象
/// </summary>
/// <returns></returns>
Paragraph* paragraph() const
{
return m_Paragraph;
}
inline int rowIndex() const {return (dynamic_cast<const CellFormat*>(m_Format))->rowIndex();}
inline int colIndex() const {return (dynamic_cast<const CellFormat*>(m_Format))->colIndex();}
inline void SetCellInfo(int row,int column,QString content)
{
dynamic_cast<CellFormat*>(m_Format)->SetRowColumn(row,column);
if (m_Paragraph != nullptr)
{
QList<BaseItem*> item = m_Paragraph->blocks();
if (item.count()> 0)
{
for(int i=(item.count()-1);i>0;i--)
{
delete item[i];
item.removeAt(i);
}
Text* text = static_cast<Text*>(item[0]);
text->SetValue(content);
}else
{
m_Paragraph = new Paragraph(content);
}
//delete m_Paragraph;
}
}
inline void SetCellSapn(int rowspan=1,int colspan=1)
{
CellFormat* tmpFormat = dynamic_cast<CellFormat*>(m_Format);
tmpFormat->SetRowSpan(rowspan);
tmpFormat->SetColSpan(colspan);
}
inline void SetDynamicCol(bool bDynamic = true)
{
dynamic_cast<CellFormat*>(m_Format)->SetDynamic(bDynamic);
}
inline bool dynamiccol(){return (dynamic_cast<const CellFormat*>(m_Format))->dynamic();}
inline void SetBreakRow(bool bBreak = true)
{
dynamic_cast<CellFormat*>(m_Format)->SetBreakRow(bBreak);
}
CellFormat* cellformat()
{
return dynamic_cast<CellFormat*>(m_Format);
}
private:
Paragraph* m_Paragraph;
};
/// <summary>
/// 表格元素属性类
/// </summary>
class TableFormat:public BaseFormat
{
public:
TableFormat()
{
QMap<int,qreal> width;
width.insert(0,100);
Init(1,1,width);
}
TableFormat(int rownum,int colnum,int left,int right,QMap<int,qreal> width,CCSTableType::TableBoardFlag board = CCSTableType::Nothing,bool norecord = true,
bool headerepeat=true,bool transpose=false):BaseFormat(left,0,right,0)
{
Init(rownum,colnum,width,"",true,norecord,board,headerepeat,transpose,CCSTableType::NoBreak);
}
TableFormat(int rownum,int colnum,QMap<int,qreal> width,int left=0,int right=0,CCSTableType::TableBoardFlag board = CCSTableType::Nothing,bool norecord = true,
bool headerepeat=true,bool transpose=false):BaseFormat(left,0,right,0)
{
Init(rownum,colnum,width,"",true,norecord,board,headerepeat,transpose,CCSTableType::NoBreak);
}
void Init(int rownum,int colnum,QMap<int,qreal> width,QString DataseName="",bool shownoheader = true,bool norecord = true,CCSTableType::TableBoardFlag board = CCSTableType::Nothing,
bool headerepeat=true,bool transpose=false,CCSTableType::TableBreakFlag breaktype = CCSTableType::TableBreak)
{
m_iRowCount = rownum;
m_iColumnCount = colnum;
m_bHeaderRepeat = headerepeat;
QMap<int, qreal>::iterator iter = width.begin();
while (iter != width.end())
{
m_mapColWidth.insert(iter.key(),iter.value());
iter++;
}
m_strDatasetName = DataseName;
//m_bSplitColumns = splitcolumns; //都放在 breaktype中说明
m_bTranspose=transpose; //是否进行表的转置 缺省false
m_bShowNoRecord = norecord; //当没有记录时,表是否显示,针对动态表;缺省显示列头 true
m_eBorderType = board;
m_eBreakType = breaktype;
m_bShowHeader = shownoheader;
m_qRowHeight = 0;
m_qPadding = 0;
m_qSpacing = 0;
m_iHeaderRowCount = 1;
m_eWidthType = 0;
m_eTableType = 0;
m_qSpacing =0;
}
TableFormat(const TableFormat& tableF):BaseFormat(tableF)
{
m_iRowCount = tableF.rowcount();;
m_iColumnCount = tableF.columncount();
m_iHeaderRowCount = tableF.headerrowcount();
m_eWidthType = 0;
m_eTableType = 0;
m_qSpacing =0;
m_bHeaderRepeat = tableF.m_bHeaderRepeat;
QMap<int, qreal>::const_iterator iter = tableF.m_mapColWidth.begin();
while (iter != tableF.m_mapColWidth.end())
{
m_mapColWidth.insert(iter.key(),iter.value());
iter++;
}
//m_bSplitColumns = tableF.m_bSplitColumns; //列过多时,是否折行;还是挤在一行中
m_bTranspose=tableF.m_bTranspose; //是否进行表的转置 缺省false
m_bShowNoRecord = tableF.m_bShowNoRecord; //当没有记录时,表是否显示,针对动态表;缺省显示列头 true
m_qRowHeight = tableF.m_qRowHeight;
m_strDatasetName = tableF.m_strDatasetName;
m_eBreakType = tableF.m_eBreakType;
m_qPadding = tableF.m_qPadding;
m_qSpacing = tableF.m_qSpacing;
m_eBorderType = tableF.m_eBorderType;
m_bShowHeader = tableF.m_bShowHeader;
}
TableFormat& operator= (const TableFormat& tableF)
{
m_iRowCount = tableF.rowcount();;
m_iColumnCount = tableF.columncount();
m_iHeaderRowCount = tableF.headerrowcount();
m_eWidthType = 0;
m_eTableType = 0;
m_qSpacing =0;
m_bHeaderRepeat = tableF.m_bHeaderRepeat;
QMap<int, qreal>::iterator iter = tableF.colWidth().begin();
while (iter != tableF.colWidth().end())
{
m_mapColWidth.insert(iter.key(),iter.value());
iter++;
}
//m_bSplitColumns = tableF.m_bSplitColumns; //列过多时,是否折行;还是挤在一行中
m_bTranspose=tableF.m_bTranspose; //是否进行表的转置 缺省false
m_bShowNoRecord = tableF.m_bShowNoRecord; //当没有记录时,表是否显示,针对动态表;缺省显示列头 true
m_qRowHeight = tableF.m_qRowHeight;
m_strDatasetName = tableF.m_strDatasetName;
m_eBreakType = tableF.m_eBreakType;
m_qPadding = tableF.m_qPadding;
m_qSpacing = tableF.m_qSpacing;
m_eBorderType = tableF.m_eBorderType;
m_bShowHeader = tableF.m_bShowHeader;
return *this;
}
/// <summary>
/// 表的行数。主要用于列头
/// </summary>
/// <param name="count"></param>
void SetRowCount(const int& count){m_iRowCount = count;}
/// <summary>
/// 表的列数
/// </summary>
/// <param name="count"></param>
void SetColumnCount(const int& count){m_iColumnCount = count;}
/// <summary>
/// 【未用】
/// </summary>
/// <param name="count"></param>
void SetHeaderRowCount(const int& count){m_iHeaderRowCount = count;}
/// <summary>
/// 【未用】
/// </summary>
/// <param name="eType"></param>
void SetTableType(int eType){
m_eTableType = eType;
}
int tabletype() const {return m_eTableType;}
int rowcount() const {return m_iRowCount;}
int columncount() const {return m_iColumnCount;}
int headerrowcount() const {return m_iHeaderRowCount;}
void SetSpacing(const qreal& spacing){m_qSpacing = spacing;}
qreal spacing() const{return m_qSpacing;}
/// <summary>
/// 列宽 ,按百分比给出
/// </summary>
/// <param name="colIndex"></param>
/// <param name="width"></param>
void SetColWidth(int colIndex,int width){m_mapColWidth.insert(colIndex,width);}
void SetColWidth(QMap<int,qreal> width)
{
m_mapColWidth.clear();
QMap<int,qreal>::iterator it;
for ( it = width.begin(); it != width.end(); ++it ) {
m_mapColWidth.insert(it.key(),it.value());
}
}
/// <summary>
/// 列宽 ,按百分比给出
/// </summary>
/// <returns></returns>
QMap<int,qreal> colWidth() const {return m_mapColWidth;}
/// <summary>
/// 表头是否显示
/// </summary>
/// <param name="bFlag"></param>
void SetShowHeader(bool bFlag) {m_bShowHeader = bFlag;}
bool showheader() const {return m_bShowHeader;}
/// <summary>
/// 当没有记录时,表是否显示,针对动态表;缺省显示列头 true
/// </summary>
/// <param name="bNorecord"></param>
void SetShowNoRecord(bool bNorecord) {m_bShowNoRecord = bNorecord;}
bool shownorecord() const {return m_bShowNoRecord;}
/// <summary>
/// 数据源中的对象名称
/// </summary>
/// <param name="name"></param>
void SetDatasetName(const QString& name){m_strDatasetName = name;}
QString datasetname() const {return m_strDatasetName;}
/// <summary>
/// 是否进行表的转置
/// </summary>
/// <param name="bFlag"></param>
void SetTranspose(bool bFlag) {m_bTranspose = bFlag;}
bool transpose() const {return m_bTranspose;}
/// <summary>
/// 折行类型
/// </summary>
/// <param name="iType"></param>
void SetBreakType(CCSTableType::TableBreakFlag iType){m_eBreakType = iType;}
CCSTableType::TableBreakFlag breaktype() const {return m_eBreakType;}
/// <summary>
/// 表格边框类型
/// </summary>
/// <returns></returns>
CCSTableType::TableBoardFlag tablebordertype() const {return m_eBorderType;}
void SetTableBorderType(CCSTableType::TableBoardFlag iType){m_eBorderType = iType;}
inline void SetPadding(const qreal& padding){m_qPadding = padding;}
inline qreal padding() const {return m_qPadding;}
private:
int m_iRowCount;
int m_iColumnCount;
int m_iHeaderRowCount;
int m_eWidthType; //宽度类型,是按百分比还是按厘米;缺省按百分比
int m_eTableType; //表类型 固定、动态、子表 目前应该没有用到
// int m_iMarginLeft; //左边距 在基类里体现
// int m_iMarginRight; //右边距
qreal m_qPadding; //缺省都为0
qreal m_qSpacing; //缺省都为0
qreal m_qRowHeight; // 行高,先不考虑涉及到列头、表正文和表尾的行高;考虑当内容为图片的高度,如果没有设置,则为图片的原始高度
bool m_bHeaderRepeat; //表头换页时是否重复缺省为true
//bool m_bSplitColumns; //列过多时,是否折行;还是挤在一行中
bool m_bTranspose; //是否进行表的转置 缺省false
bool m_bShowNoRecord; //当没有记录时,表是否显示,针对动态表;缺省显示列头 true
bool m_bShowHeader; //是否显示表头
QString m_strDatasetName; //数据源数据表的名称
CCSTableType::TableBreakFlag m_eBreakType; //折行类型,按记录折行还是按表折行
CCSTableType::TableBoardFlag m_eBorderType; //表格边框样式
QMap<int,qreal> m_mapColWidth; //列宽
};
/// <summary>
/// 表格元素类 ,包含多个单元格
/// </summary>
class Table:public BaseItem
{
public://QTextTableCellFormat
Table(QString name=""):BaseItem(name)
{
m_Format = new TableFormat();
m_Type = classtype::Table;
}
Table(const TableFormat& format,QString name=""):BaseItem(name)
{
m_Format = new TableFormat(format);
m_Type = classtype::Table;
}
Table(int row,int column,int left,int right,qreal height=0)
{
QMap<int,qreal> colWidth;
qreal qCol = 100/column;
for(int i=0;i<column;i++)
{
colWidth.insert(i,qCol);
}
TableFormat *pTableF =new TableFormat(row,column,left,right,colWidth);
this->m_Format = pTableF;
m_Type = classtype::Table;
}
Table(int row,int column,QMap<int,qreal> width,int left,int right,qreal height=0)
{
TableFormat *pTableF = new TableFormat(row,column,left,right,width);
this->m_Format = pTableF;
m_Type = classtype::Table;
}
//拷贝构造函数
Table(const Table& table)
{
QMap<int,QMap<int,Cell*>>::iterator it;
for(it=m_Cells.begin();it!=m_Cells.end();++it)
{
QMap<int,Cell*>::iterator it1;
for(it1=it.value().begin();it1!=it.value().end();++it1)
{
delete it1.value();
}
}
QMap<int,QMap<int,Cell*>>::const_iterator sourceit;
for(sourceit=table.m_Cells.begin();sourceit!=table.m_Cells.end();++sourceit)
{
QMap<int,Cell*>::const_iterator sourceit1;
QMap<int,Cell*> tmpHash;
for(sourceit1=sourceit.value().begin();sourceit1!=sourceit.value().end();++sourceit1)
{
Cell * cell = new Cell(*sourceit1.value());
tmpHash.insert(sourceit1.key(),cell);
}
m_Cells.insert(sourceit.key(),tmpHash);
}
TableFormat* pF = dynamic_cast<TableFormat*>(table.m_Format);
m_Format = new TableFormat(*pF);
m_Type = classtype::Table;
}
//赋值构造函数
Table& operator= (const Table& table)
{
QMap<int,QMap<int,Cell*>>::iterator it;
for(it=m_Cells.begin();it!=m_Cells.end();++it)
{
QMap<int,Cell*>::iterator it1;
for(it1=it.value().begin();it1!=it.value().end();++it1)
{
delete it1.value();
}
}
m_Cells.clear();
QMap<int,QMap<int,Cell*>>::const_iterator sourceit;
for(sourceit=table.m_Cells.begin();sourceit!=table.m_Cells.end();++sourceit)
{
QMap<int,Cell*>::const_iterator sourceit1;
QMap<int,Cell*> tmpHash;
for(sourceit1=sourceit.value().begin();sourceit1!=sourceit.value().end();++sourceit1)
{
Cell * cell = new Cell(*sourceit1.value());
tmpHash.insert(sourceit1.key(),cell);
}
m_Cells.insert(sourceit.key(),tmpHash);
}
if (m_Format != nullptr) {delete m_Format;}
TableFormat* pF = dynamic_cast<TableFormat*>(table.m_Format);
m_Format = new TableFormat(*pF);
m_Type = table.m_Type;
return *this;
}
virtual ~Table()
{
for (auto& items : m_Cells) {
for (auto item : items) {
delete item;
}
}
}
bool AddCell(const Cell& cell)
{
Cell *pCell = new Cell(cell);
AddCell(pCell);
return true;
}
bool AddCell(int rownum, int colnum,Paragraph& para,CCSFrame::FrameFlags frame,int rowspan=1,int colspan=1,QPen pen=QPen(),QColor color = QColor(255,255,255,255))
{
ParagraphFormat* pF = dynamic_cast<ParagraphFormat*>(para.Format());
CellFormat cF(rownum,colnum,frame,pF->alignment(),rowspan,colspan,0,false,false,false);
cF.SetFramePen(pen);
cF.SetBackColor(color);
Cell* cell=new Cell(para,cF);
AddCell(cell);
return true;
}
bool AddCell(int rownum,int colnum,QString &content,QFont font = QFont(),CCSFrame::FrameFlags frame=CCSFrame::FrameNothing,Qt::Alignment align = Qt::AlignCenter,int rowspan=1,int colspan=1,QPen pen=QPen(),QColor color = QColor(255,255,255,255))
{
Cell* cell = new Cell(content,rownum,colnum,font,frame,align,rowspan,colspan,pen,color);
AddCell(cell);
return true;
}
bool AddCell(int rownum, int colnum,const Text &text,CCSFrame::FrameFlags frame,Qt::Alignment align = Qt::AlignCenter,int rowspan=1,int colspan=1,QPen pen=QPen(),QColor color = QColor(255,255,255,255))
{
Cell* cell = new Cell(text,rownum,colnum,frame,align,rowspan,colspan,0,pen,color);
AddCell(cell);
return true;
}
bool AddCell(int rownum, int colnum,const Image &image,CCSFrame::FrameFlags frame,Qt::Alignment align = Qt::AlignCenter,int rowspan=1,int colspan=1,QPen pen=QPen(),QColor color = QColor(255,255,255,255))
{
Cell* cell = new Cell(image,rownum,colnum,frame,align,rowspan,colspan,0,pen,color);
AddCell(cell);
return true;
}
bool AddCell(int rownum, int colnum,const Cell& cell)
{
Cell *pCell = new Cell(cell);
pCell->cellformat()->SetRowColumn(rownum,colnum);
AddCell(pCell);
return true;
}
QMap<int,QMap<int,Cell*>> & cells(){return m_Cells;}
QMap<int,Cell*> & cell(int i){return m_Cells[i];}
void SetColWidth(int colIndex,int width)
{
dynamic_cast<TableFormat*>(m_Format)->SetColWidth(colIndex,width);
}
qreal colwidth(int colIndex)
{
return static_cast<TableFormat*>(m_Format)->colWidth()[colIndex];
}
protected:
bool AddCell(Cell* cell)
{
int irowIndex = cell->rowIndex();
int icolIndex = cell->colIndex();
if (m_Cells.contains(icolIndex))
{
if (m_Cells.value(icolIndex).contains(irowIndex))
{
m_Cells[icolIndex].remove(irowIndex);
}
m_Cells[icolIndex].insert(irowIndex,cell);
}else
{
QMap<int,Cell*> a;
a.insert(irowIndex,cell);
// Cell* tmp = a[irowIndex];
m_Cells.insert(icolIndex,a);
}
return true;
}
private:
//QList<QPair<int,Cell*>> m_Cells;
QMap<int,QMap<int,Cell*>> m_Cells;
};
/// <summary>
///动态表格元素类;包含内容行定义、子表定义和总结行定义
/// </summary>
class TableDynamic:public Table
{
public:
TableDynamic(QString name=""):Table(name)
{
m_bHasSubtable = false;
m_iSubHeaderPos = 0;
m_Format = new TableFormat();
m_Type = classtype::TableDynamic;
m_SubTable = nullptr;
}
TableDynamic(const TableFormat& format,QString name=""):Table(name)
{
m_bHasSubtable = false;
m_iSubHeaderPos = 0;
m_Format = new TableFormat(format);
m_Type = classtype::TableDynamic;
m_SubTable = nullptr;
}
//拷贝构造函数
TableDynamic(const TableDynamic& table):Table(table),
m_bHasSubtable(table.m_bHasSubtable),
m_iSubHeaderPos(table.m_iSubHeaderPos),
m_strSubKeyField(table.m_strSubKeyField)
{
if (table.m_SubTable){
m_SubTable = new TableDynamic(*(table.m_SubTable));
}else
{
m_SubTable = nullptr;
}
for(auto& item: m_ContentCells)
{
delete item;
}
QMap<int,Cell*>::const_iterator sourceit2;
for(sourceit2=table.m_ContentCells.begin();sourceit2!=table.m_ContentCells.end();++sourceit2)
{
Cell * cell = new Cell(*sourceit2.value());
m_ContentCells.insert(sourceit2.key(),cell);
}
for(auto& item:m_BottomCells)
{
for(auto&item1:item)
{
delete item1;
}
}
QMap<int,QMap<int,Cell*>>::const_iterator sourceit;
for(sourceit=table.m_BottomCells.begin();sourceit!=table.m_BottomCells.end();++sourceit)
{
QMap<int,Cell*>::const_iterator sourceit1;
QMap<int,Cell*> tmpHash;
for(sourceit1=sourceit.value().begin();sourceit1!=sourceit.value().end();++sourceit1)
{
Cell * cell = new Cell(*sourceit1.value());
tmpHash.insert(sourceit1.key(),cell);
}
m_BottomCells.insert(sourceit.key(),tmpHash);
}
m_Type = classtype::TableDynamic;
}
//赋值构造函数
TableDynamic& operator= (const TableDynamic& table)
{
if (m_SubTable != nullptr) {delete m_SubTable;}
m_SubTable = new TableDynamic(*(table.m_SubTable));
for(auto& item: m_ContentCells)
{
delete item;
}
QMap<int,Cell*>::const_iterator sourceit2;
for(sourceit2=table.m_ContentCells.begin();sourceit2!=table.m_ContentCells.end();++sourceit2)
{
Cell * cell = new Cell(*sourceit2.value());
m_ContentCells.insert(sourceit2.key(),cell);
}
for(auto& item:m_BottomCells)
{
for(auto&item1:item)
{
delete item1;
}
}
QMap<int,QMap<int,Cell*>>::const_iterator sourceit;
for(sourceit=table.m_BottomCells.begin();sourceit!=table.m_BottomCells.end();++sourceit)
{
QMap<int,Cell*>::const_iterator sourceit1;
QMap<int,Cell*> tmpHash;
for(sourceit1=sourceit.value().begin();sourceit1!=sourceit.value().end();++sourceit1)
{
Cell * cell = new Cell(*sourceit1.value());
tmpHash.insert(sourceit1.key(),cell);
}
m_BottomCells.insert(sourceit.key(),tmpHash);
}
Table::operator =(table);
m_Type = table.m_Type;
m_bHasSubtable = table.m_bHasSubtable;
m_iSubHeaderPos = table.m_iSubHeaderPos;
m_strSubKeyField = table.m_strSubKeyField;
return *this;
}
~TableDynamic()
{
for (auto& items : m_BottomCells) {
for (auto& item : items) {
delete item;
}
}
for(auto item:m_ContentCells)
{
delete item;
}
if (m_SubTable != nullptr)
{
delete m_SubTable;
}
}
bool AddHeaderCell(const Cell &cell)
{
return AddCell(cell);
}
bool AddContentCell(const Cell &cell)
{
Cell *pCell = new Cell(cell);
CellFormat* cellformat = static_cast<CellFormat*>(cell.Format());
int icolIndex = cellformat->colIndex();
if (m_ContentCells.contains(icolIndex))
{
m_ContentCells.remove(icolIndex);
}
m_ContentCells.insert(icolIndex,pCell);
return true;
}
inline bool AddSubTable(const TableDynamic &table,const QStringList &keyFields,int iSubHeaderPos=0)
{
TableDynamic* pDTable = new TableDynamic(table);
m_bHasSubtable = true;
m_iSubHeaderPos = iSubHeaderPos;
m_strSubKeyField = keyFields;
m_SubTable = pDTable;
return true;
}
bool AddBottomCell(const Cell & cell)
{
Cell *pCell = new Cell(cell);
int irowIndex = cell.rowIndex();
int icolIndex = cell.colIndex();
if (m_BottomCells.contains(icolIndex))
{
if (m_BottomCells.value(icolIndex).contains(irowIndex))
{
m_BottomCells[icolIndex].remove(irowIndex);
}
m_BottomCells[icolIndex].insert(irowIndex,pCell);
}else
{
QMap<int,Cell*> hashCell;
hashCell.insert(irowIndex,pCell);
m_BottomCells.insert(icolIndex,hashCell);
}
return true;
}
void SetDatasetName(const QString& name)
{
TableFormat* tableformat = static_cast<TableFormat*>(this->m_Format);
tableformat->SetDatasetName(name);
}
QMap<int,Cell*> dynamiccells() const {return m_ContentCells;}
bool HasSubtable() const {return m_bHasSubtable;}
/// <summary>
/// 父表和子表的关联字段
/// </summary>
/// <returns></returns>
QStringList subkeyfields() const {return m_strSubKeyField;}
/// <summary>
/// 子表的表头是否在顶级父表头中
/// </summary>
/// <returns></returns>
int SubHeaderPos() const { return m_iSubHeaderPos; }
TableDynamic* subTable() const {return m_SubTable;}
QMap<int,QMap<int,Cell*>>& bottomcells() {return m_BottomCells;}
private:
bool m_bHasSubtable;
int m_iSubHeaderPos; // =0 子表头 =1 在父表头
QStringList m_strSubKeyField;
TableDynamic* m_SubTable;
QMap<int,Cell*> m_ContentCells;
QMap<int,QMap<int,Cell*>> m_BottomCells;
};
/// <summary>
/// 表格组类,包含静态表、动态表
/// </summary>
class TableGroup:public Table
{
public:
TableGroup():Table()
{
m_Type = classtype::TableGroup;
}
TableGroup(QStringList& tables,QStringList& keys):Table(){
m_Type = classtype::TableGroup;
m_Keys = keys;
m_Tables = tables;
}
TableGroup(const TableGroup& table):Table(table),m_Keys(table.m_Keys),m_Tables(table.m_Tables)
{
m_Type = classtype::TableGroup;
for(auto& item:table.m_Items)
{
//要判断是动态表还是group表还是普通表
classtype name = item->elementType();
if (name == classtype::TableDynamic)
{
TableDynamic * td = new TableDynamic(*(TableDynamic*)item);
m_Items.append(td);
}else if (name == classtype::TableGroup)
{
TableGroup *tg = new TableGroup(*(TableGroup*)item);
m_Items.append(tg);
}
else
{
Table *t = new Table(*item);
m_Items.append(t);
}
}
}
~TableGroup()
{
for(auto& item:m_Items)
{
delete item;
}
}
bool AddItem(const TableDynamic &table)
{
TableDynamic* pTable = new TableDynamic(table);
m_Items.append(pTable);
return true;
}
bool AddItem(const Table& table)
{
Table* pTable = new Table(table);
m_Items.append(pTable);
return true;
}
bool AddItem(Image& item)
{
Image *pImage = new Image(item);
ImageFormat *f = dynamic_cast<ImageFormat*>(item.Format());
Table* table = new Table(1,1,f->marginLeft(),f->marginRight()); //缺省图片在表格的左边
table->AddCell(0,0,*pImage,CCSFrame::FrameNothing);
//把段落的左右边距赋值给表格;缺省 = 页的边距
m_Items.append(table);
return true;
}
bool AddItem(Paragraph& item)
{
ParagraphFormat *f = dynamic_cast<ParagraphFormat*>(item.Format());
Cell cell(item,0,0,CCSFrame::FrameNothing,f->alignment());
Table* table = new Table(1,1,0,0);
table->AddCell(cell);
m_Items.append(table);
return true;
}
bool AddItem(const Text& item)
{
//转成Table
QList<Text*> listText;
Text *pText = new Text(item);
listText.append(pText);
// Paragraph para(listText,pFormat);
TableFormat tableF;
tableF.SetNewPage(item.Format()->newpage());
Table* table = new Table(1,1,0,0);
table->AddCell(0,0,item,CCSFrame::FrameNothing);
//把段落的左右边距赋值给表格;缺省 = 页的边距
m_Items.append(table);
return true;
}
bool AddItem(const BlankLine& item)
{
// Text(const QString &content,const TextFormat &format, QString name=""):BaseItem(name)
TextFormat* format = dynamic_cast<TextFormat*>(item.Format());
Text pText("",*format);
Table* table = new Table(1,1,0,0);
table->AddCell(0,0,pText,CCSFrame::FrameNothing);
//把段落的左右边距赋值给表格;缺省 = 页的边距
m_Items.append(table);
return true;
}
//
bool AddItem(TableGroup &item)
{
TableGroup* pTable = new TableGroup(item);
m_Items.append(pTable);
return true;
}
/// <summary>
/// 表组的同一关键字段【目前仅支持一个字段】
/// </summary>
/// <param name="key"></param>
void SetKeys(const QStringList& key){m_Keys = key;}
QStringList keys() const {return m_Keys;}
void SetTables(const QStringList& name){m_Tables = name;}
QStringList tables() const {return m_Tables;}
QList<Table*> items() const {return m_Items;}
private:
QStringList m_Keys;
QStringList m_Tables;
QList<Table*> m_Items;
};
}
#endif // CCSTEMPLATEITEM_H