摘要:支持多种自定义功能。包括但不限于支持长度自定义,字体自定义,颜色自定义。老规矩先上图
基于QWidget开发,支持多种形式,根据属性可以实现多种不同类型的电子印章,有关形状枚举参考代码如下
///印章形状枚举
enum LQELECTRONICSEALIDS
{
LQESSHAPE_ROUNDE = 0, //正圆形,例如合同章,公章等
LQESSHAPE_OVALES, //椭圆形,例如发票章
LQESSHAPE_SQUARE, //正方形,例如法人章
LQESSHAPE_RECTSR //长方形,例如财务章
};
自定义功能可谓是非常全面,有关自定义属性参考代码如下
/// 电子印章控件风格数据结构体
typedef struct LQELECTRONICSEALINF_{
QColor cBkgColorsValue = Qt::transparent; //控件背景色
double dBorderSpaceVal = 4.0; //边框间距
QColor cOutBorderColor = QColor(251,60,40); //外边框颜色
QColor cInnBorderColor = QColor(242,42,21); //内边框颜色
QColor cTextColorValue = QColor(253,28,33); //印章文本颜色
double dHeightScaleVal = 1.3333; //椭圆和长方形时宽高比例
bool bHasDrawBkgClrs = false; //是否绘制背景色
uint uBorderStyleIds = 1; //边框风格,0单边框,1双边框
double dOuterBorderWid = 1.0; //外边框宽度
double dInnerBorderWid = 0.5; //内边框宽度
double dBkgRadiusValue = 0.01; //矩形圆角比例
uint uTextMaxLengths = 30; //印章正文最大长度
uint uCodeMaxLengths = 30; //印章编码最大长度
bool bShowCenterIcon = true; //是否显示中间图标
bool bIsShowCodeText = true; //是否显示编码
bool bBordersArrange = true; //是否沿着边框排列,在圆形或者椭圆时只能以此方式排列
QFont fTextFontObject; //正文字体对象
QFont fCodeFontObject; //编码字体对象
uint uTextsFontSizes = 9; //正文字体大小
uint uCodesFontSizes = 6; //编码字体大小
uint uTextPaddingVal = 6; //文本边距
double dCenterImgScale = 6.0; //控件中央图标大小比例
double dTextFullsAngle = 240.0; //印章正文角度和
double dTextStartAngle = 120.0; //印章文本起始角度
double dCodeStartAngle = 15.0; //印章编码起始角度
bool bShowSpecialTxt = false; //是否显示专项内容
bool bShowSpecialNum = false; //是否显示专项编号。专项编号与中心Logo同时只能显示一个
int nGlobalAngleVal = 0; //全局角度
uint uShowFocusLines = 2; //是否显示着重线条,0不显示,1单线,2双线
bool bTextsBoldFonts = true; //是否强制使用粗体
LQELECTRONICSEALIDS eStampShapesIds = LQESSHAPE_ROUNDE; //印章形状
bool operator == (const LQELECTRONICSEALINF_& rhs) // == 操作运算符重载
{
return (cBkgColorsValue == rhs.cBkgColorsValue)
&& (DoubleValCompare(dBorderSpaceVal,rhs.dBorderSpaceVal))
&& (cOutBorderColor == rhs.cOutBorderColor)
&& (cInnBorderColor == rhs.cInnBorderColor)
&& (cTextColorValue == rhs.cTextColorValue)
&& (DoubleValCompare(dHeightScaleVal,rhs.dHeightScaleVal))
&& (bHasDrawBkgClrs == rhs.bHasDrawBkgClrs)
&& (uBorderStyleIds == rhs.uBorderStyleIds)
&& (bIsShowCodeText == rhs.bIsShowCodeText)
&& (DoubleValCompare(dOuterBorderWid,rhs.dOuterBorderWid))
&& (DoubleValCompare(dInnerBorderWid,rhs.dInnerBorderWid))
&& (DoubleValCompare(dBkgRadiusValue,rhs.dBkgRadiusValue))
&& (uTextMaxLengths == rhs.uTextMaxLengths)
&& (uCodeMaxLengths == rhs.uCodeMaxLengths)
&& (bShowCenterIcon == rhs.bShowCenterIcon)
&& (bBordersArrange == rhs.bBordersArrange)
&& (uTextsFontSizes == rhs.uTextsFontSizes)
&& (uCodesFontSizes == rhs.uCodesFontSizes)
&& (uTextPaddingVal == rhs.uTextPaddingVal)
&& (DoubleValCompare(dCenterImgScale,rhs.dCenterImgScale))
&& (DoubleValCompare(dTextFullsAngle,rhs.dTextFullsAngle))
&& (DoubleValCompare(dTextStartAngle,rhs.dTextStartAngle))
&& (DoubleValCompare(dCodeStartAngle,rhs.dCodeStartAngle))
&& (bShowSpecialTxt == rhs.bShowSpecialTxt)
&& (eStampShapesIds == rhs.eStampShapesIds)
&& (bShowSpecialNum == rhs.bShowSpecialNum)
&& (nGlobalAngleVal == rhs.nGlobalAngleVal)
&& (uShowFocusLines == rhs.uShowFocusLines)
&& (bTextsBoldFonts == rhs.bTextsBoldFonts);
}
bool operator != (const LQELECTRONICSEALINF_& rhs) // != 操作运算符重载
{
return !(*this == rhs);
}
}LQELECTRONICSEALINF,*PLQELECTRONICSEALINF;
主要绘制定义代码如下
/// 初始化印章控件
/// \brief InitElectronicSeal
///
virtual void InitElectronicSeal();
protected:
///重写系统绘制事件
virtual void paintEvent(QPaintEvent *event) override;
/// 绘制圆形印章
/// \brief DrawRoundedStamps
/// \param painter
///
virtual void DrawRoundedStamps(QPainter *painter);
/// 绘制椭圆形印章
/// \brief DrawsOvalesStamps
/// \param painter
///
virtual void DrawsOvalesStamps(QPainter *painter);
/// 绘制正方形印章
/// \brief DrawsSquareStamps
/// \param painter
///
virtual void DrawsSquareStamps(QPainter *painter);
/// 绘制长方形印章
/// \brief DrawRectangStamps
/// \param painter
///
virtual void DrawRectangStamps(QPainter *painter);
/// 绘制印章图片
/// \brief DrawElectronicSeal
///
virtual QPixmap DrawElectronicSeal();
public:
/// 复制印章图像到 剪贴板
/// \brief CopyStampImageObj
///
void CopyStampImageObj();
/// 保存印章图像到文件
/// \brief SaveStampImageObj
/// \param uFilePath:文件路径
/// \param uError :错误信息
///
bool SaveStampImageObj(std::u16string uFilePath,std::u16string& uError);
private:
LQELECTRONICSEALINF tCtrlStylesData; //控件风格数据结构体
std::u16string sTextDataString; //控件文本数据
std::u16string sCodeDataString; //控件编码数据
std::u16string sSpecialTextVal; //图章专项数据内容
std::u16string sSpecialTextNum; //图章专项编码内容
std::u16string sCentersImgPath; //控件中间图标
太困了,先占个位,有关具体实现事宜,晚点在写。后面可能还会在补几张其它类型印章图片