#ifndef CCSTEMPLATEITEM_H #define CCSTEMPLATEITEM_H #include "ccstemplatebase.h" #include #include #include "QColor" #include "QFont" #include "QMap" #include "QPen" #include "common_types.h" namespace CCS_Report { /// /// 页属性格式定义,【暂时未用】 /// 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; //页方向;纵向、横向 }; /// /// 元素页类定义 /// 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(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(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: }; /// /// 文本属性类 /// 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(){} /// /// 文本字体 /// /// 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;} /// /// 字体颜色 /// /// inline QColor color() const {return m_Color;} inline void SetColor(const QColor& value){ m_Color = value;} /// /// 设置上、下标标识 /// /// inline int charformat() const {return m_qAlignCharFormatFlag;} inline void SetCharFormat(const int& flag){m_qAlignCharFormatFlag = flag;} /// /// 是否加空格 【目前未实现】 /// /// inline int spaceflag() const {return m_iAddFirstSpaceFlag;} inline void SetSpaceFlag(int& flag){m_iAddFirstSpaceFlag = flag;} /// /// 文本折行标识; /// 当文本在一个单元格中的一行显示不下时,进行换行的标识 /// /// inline CCSTextWrapType::TextWrapFlag wrapflag() const {return m_iWrapFlag;} inline void SetWrapFlag(CCSTextWrapType::TextWrapFlag& flag){m_iWrapFlag = flag;} /// /// 是否属于某个组 ;缺省false; 只有在定义tablegroup元素时用到此属性 /// /// inline bool group() const {return m_bGroup;} inline void SetGroup(bool& flag){m_bGroup = flag;} /// /// 字体角度【目前只支持水印】 /// /// 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; }; /// /// /// 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(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(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(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(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(blank.m_Format); m_Format = new TextFormat(*pF); m_Name = blank.m_Name; } private: QString m_strText; int m_iLineNum; }; /// /// 图片属性设置 /// 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; } /// /// 透明度【暂未使用】 /// /// inline qreal opacity() const {return m_opacity;} inline void SetOpacity(const qreal& opacity){m_opacity = opacity;} /// /// 角度 【暂未实现】 /// /// inline qreal angle() const {return m_qAngle;} inline void SetAngle(const qreal& value){ m_qAngle = value;} /// /// 宽度模式设置 /// /// inline CCSImageType::ImageWidthFlag widthmode() const {return m_eWidthMode;} inline void SetWidthMode(const CCSImageType::ImageWidthFlag& flag){m_eWidthMode = flag;} /// /// 显示模式,=0 自适应 =1 裁剪 /// /// inline qreal showmode() const {return m_eShowMode;} inline void SetShowMode(const int& mode){m_eShowMode = mode;} /// /// 高度模式设置 /// /// 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; }; /// /// 图片元素类 /// 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(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(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; //图片路径 }; /// /// 段落元素属性类 /// 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; } /// /// 段落级别设置 1~n /// /// inline void SetGrade(int &grade){m_iGrade = grade;} /// /// 首行缩进 【暂未使用】 /// /// inline void SetIndent(int &indent){m_iIndent = indent;} /// /// 位置设置 居左、居右、居中 /// /// 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;} /// /// 级别字体设置 /// /// inline QFont font() const {return m_Font;} inline void SetFont(const QFont font){m_Font = font;} /// /// 是否显示级别号 true 显示 /// /// inline bool showgrade() const {return m_bShowGrade;} inline void SetShowGrade(const bool bShow){m_bShowGrade = bShow;} /// /// 行间距 以像素计 /// /// inline qreal linespace() const {return m_qLineSpace;} inline void SetLineSpace(const qreal value){m_qLineSpace = value;} /// /// 段前距离 以像素计 /// /// inline qreal distancebefore() const {return m_qDistanceBefore;} inline void SetDistanceBefore(const qreal value){m_qDistanceBefore = value;} /// /// 段后距离 以像素计 /// /// 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; //段前间距; 以像素计 }; /// /// 段落元素类;可包含多个文本类或者一个图片类 /// /// /// /// /// 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 &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(item))); m_Blocks.append(text); } else { Image* image = new Image(*(dynamic_cast(item))); m_Blocks.append(image); } } ParagraphFormat* pF = dynamic_cast(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(item))); m_Blocks.append(text); } else { Image* image = new Image(*(dynamic_cast(item))); m_Blocks.append(image); } } ParagraphFormat* pF = dynamic_cast(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 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); } /// /// 获取段落中的文本或者图片对象 /// /// inline QList 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 m_Blocks; }; /// /// 单元格属性类 /// 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; } /// /// 是否有边框 /// /// inline void SetFrame(const CCSFrame::FrameFlags frame){m_Frame = frame;} inline CCSFrame::FrameFlags frame() const {return m_Frame;} /// /// 边框样式 /// /// inline void SetFramePen(const QPen& pen){m_FramePen = pen;} inline QPen framepen() const {return m_FramePen;} /// /// 单元格背景色 /// /// inline void SetBackColor(const QColor& color) {m_BackColor = color;} inline QColor backColor() const {return m_BackColor;} /// /// 【未用】 /// /// inline void SetIfHasBackColor(bool &flag){m_bBackColor = flag;} inline bool ifhasbackcolor(){return m_bBackColor;} /// /// 设置跨行个数 /// 此属性一般用于表格中的列头 /// /// inline void SetRowSpan(const int& span){m_iRowSpan = span;} inline int rowSpan() const {return m_iRowSpan;} /// /// 设置跨列个数 /// 此属性一般用于表格中的列头 /// /// inline void SetColSpan(const int& span){m_iColSpan = span;} inline int colSpan() const {return m_iColSpan;} /// /// 单元格内容的位置:居左、居右、居中 /// /// inline Qt::Alignment alignment() const {return m_Alignment;} inline void SetAlignment(const Qt::Alignment align){m_Alignment = align;} /// /// 设置行、列 /// /// /// inline void SetRowColumn(int row,int column) { m_iRowIndex = row; m_iColumnIndex = column; } /// /// 行索引 /// /// inline int rowIndex() const {return m_iRowIndex;} /// /// 列索引 /// /// inline int colIndex() const {return m_iColumnIndex;} /// /// 是否为动态单元格;动态单元格是指此单元格中的数据根据用户设定的数据的多少确定,动态扩展列; /// 此属性一般用于表格中的列头 /// /// inline void SetDynamic(const bool bDynamic) { m_bDynamic = bDynamic;} inline bool dynamic() const {return m_bDynamic;} /// /// 当上下行内容相同时,是否合并 /// 此属性一般用于表格中的内容列 /// /// inline void SetMerge(const bool bMerge) { m_bMerge = bMerge;} inline bool merge() const {return m_bMerge;} /// /// 是否为转置单元格 /// /// inline void SetTranRow(bool bTranRow) {m_bTranRow = bTranRow;} inline bool tranrow() const {return m_bTranRow;} /// /// 是否属于表组;【暂未使用】 /// /// inline void SetGroup(bool bFlag) {m_bGroup = bFlag;} inline bool group() const {return m_bGroup;} /// /// 折行标志 此单元格列是否为折行,如果为true,则折行显示 /// /// inline void SetBreakRow(bool bFlag) {m_bBreakRow = bFlag;} inline bool breakrow() const {return m_bBreakRow;} /// /// 此单元格列在折行时是否重复出现 /// 此属性一般用于表格中的列头 /// /// inline void SetRepeatShow(bool bFlag) {m_bRepeat = bFlag;} inline bool repeatshow() const {return m_bRepeat;} /// /// 单元格边距 /// /// 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 }; /// /// 单元格元素类; 包含一个段落 /// 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& 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& 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(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(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) { m_Paragraph->AddTexts(text); } /// /// 获取包含的段落对象 /// /// Paragraph* paragraph() const { return m_Paragraph; } inline int rowIndex() const {return (dynamic_cast(m_Format))->rowIndex();} inline int colIndex() const {return (dynamic_cast(m_Format))->colIndex();} inline void SetCellInfo(int row,int column,QString content) { dynamic_cast(m_Format)->SetRowColumn(row,column); if (m_Paragraph != nullptr) { QList 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(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(m_Format); tmpFormat->SetRowSpan(rowspan); tmpFormat->SetColSpan(colspan); } inline void SetDynamicCol(bool bDynamic = true) { dynamic_cast(m_Format)->SetDynamic(bDynamic); } inline bool dynamiccol(){return (dynamic_cast(m_Format))->dynamic();} inline void SetBreakRow(bool bBreak = true) { dynamic_cast(m_Format)->SetBreakRow(bBreak); } CellFormat* cellformat() { return dynamic_cast(m_Format); } private: Paragraph* m_Paragraph; }; /// /// 表格元素属性类 /// class TableFormat:public BaseFormat { public: TableFormat() { QMap width; width.insert(0,100); Init(1,1,width); } TableFormat(int rownum,int colnum,int left,int right,QMap 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 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 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::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::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::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; } /// /// 表的行数。主要用于列头 /// /// void SetRowCount(const int& count){m_iRowCount = count;} /// /// 表的列数 /// /// void SetColumnCount(const int& count){m_iColumnCount = count;} /// /// 【未用】 /// /// void SetHeaderRowCount(const int& count){m_iHeaderRowCount = count;} /// /// 【未用】 /// /// 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;} /// /// 列宽 ,按百分比给出 /// /// /// void SetColWidth(int colIndex,int width){m_mapColWidth.insert(colIndex,width);} void SetColWidth(QMap width) { m_mapColWidth.clear(); QMap::iterator it; for ( it = width.begin(); it != width.end(); ++it ) { m_mapColWidth.insert(it.key(),it.value()); } } /// /// 列宽 ,按百分比给出 /// /// QMap colWidth() const {return m_mapColWidth;} /// /// 表头是否显示 /// /// void SetShowHeader(bool bFlag) {m_bShowHeader = bFlag;} bool showheader() const {return m_bShowHeader;} /// /// 当没有记录时,表是否显示,针对动态表;缺省显示列头 true /// /// void SetShowNoRecord(bool bNorecord) {m_bShowNoRecord = bNorecord;} bool shownorecord() const {return m_bShowNoRecord;} /// /// 数据源中的对象名称 /// /// void SetDatasetName(const QString& name){m_strDatasetName = name;} QString datasetname() const {return m_strDatasetName;} /// /// 是否进行表的转置 /// /// void SetTranspose(bool bFlag) {m_bTranspose = bFlag;} bool transpose() const {return m_bTranspose;} /// /// 折行类型 /// /// void SetBreakType(CCSTableType::TableBreakFlag iType){m_eBreakType = iType;} CCSTableType::TableBreakFlag breaktype() const {return m_eBreakType;} /// /// 表格边框类型 /// /// 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 m_mapColWidth; //列宽 }; /// /// 表格元素类 ,包含多个单元格 /// 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 colWidth; qreal qCol = 100/column; for(int i=0;im_Format = pTableF; m_Type = classtype::Table; } Table(int row,int column,QMap 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>::iterator it; for(it=m_Cells.begin();it!=m_Cells.end();++it) { QMap::iterator it1; for(it1=it.value().begin();it1!=it.value().end();++it1) { delete it1.value(); } } QMap>::const_iterator sourceit; for(sourceit=table.m_Cells.begin();sourceit!=table.m_Cells.end();++sourceit) { QMap::const_iterator sourceit1; QMap 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(table.m_Format); m_Format = new TableFormat(*pF); m_Type = classtype::Table; } //赋值构造函数 Table& operator= (const Table& table) { QMap>::iterator it; for(it=m_Cells.begin();it!=m_Cells.end();++it) { QMap::iterator it1; for(it1=it.value().begin();it1!=it.value().end();++it1) { delete it1.value(); } } m_Cells.clear(); QMap>::const_iterator sourceit; for(sourceit=table.m_Cells.begin();sourceit!=table.m_Cells.end();++sourceit) { QMap::const_iterator sourceit1; QMap 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(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(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> & cells(){return m_Cells;} QMap & cell(int i){return m_Cells[i];} void SetColWidth(int colIndex,int width) { dynamic_cast(m_Format)->SetColWidth(colIndex,width); } qreal colwidth(int colIndex) { return static_cast(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 a; a.insert(irowIndex,cell); // Cell* tmp = a[irowIndex]; m_Cells.insert(icolIndex,a); } return true; } private: //QList> m_Cells; QMap> m_Cells; }; /// ///动态表格元素类;包含内容行定义、子表定义和总结行定义 /// 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::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>::const_iterator sourceit; for(sourceit=table.m_BottomCells.begin();sourceit!=table.m_BottomCells.end();++sourceit) { QMap::const_iterator sourceit1; QMap 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::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>::const_iterator sourceit; for(sourceit=table.m_BottomCells.begin();sourceit!=table.m_BottomCells.end();++sourceit) { QMap::const_iterator sourceit1; QMap 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(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 hashCell; hashCell.insert(irowIndex,pCell); m_BottomCells.insert(icolIndex,hashCell); } return true; } void SetDatasetName(const QString& name) { TableFormat* tableformat = static_cast(this->m_Format); tableformat->SetDatasetName(name); } QMap dynamiccells() const {return m_ContentCells;} bool HasSubtable() const {return m_bHasSubtable;} /// /// 父表和子表的关联字段 /// /// QStringList subkeyfields() const {return m_strSubKeyField;} /// /// 子表的表头是否在顶级父表头中 /// /// int SubHeaderPos() const { return m_iSubHeaderPos; } TableDynamic* subTable() const {return m_SubTable;} QMap>& bottomcells() {return m_BottomCells;} private: bool m_bHasSubtable; int m_iSubHeaderPos; // =0 子表头 =1 在父表头 QStringList m_strSubKeyField; TableDynamic* m_SubTable; QMap m_ContentCells; QMap> m_BottomCells; }; /// /// 表格组类,包含静态表、动态表 /// 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(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(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 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(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; } /// /// 表组的同一关键字段【目前仅支持一个字段】 /// /// 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 items() const {return m_Items;} private: QStringList m_Keys; QStringList m_Tables; QList m_Items; }; } #endif // CCSTEMPLATEITEM_H