Qt 自定义旋转控件lable widget

my_namespace.h

#ifndef MY_NAMESPACE_H
#define MY_NAMESPACE_H


#include <QLabel>
#include <QtGlobal>
#include <QWidget>
#include <QLabel>
#include <QString>
#include <QPainter>
#include <QStylePainter>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QFrame>
namespace my_namespace {
    typedef quint16 WidgetType;
    typedef quint16 WidgetIdent;
    typedef quint16 ParentIdent;
    typedef quint8 Visible;
    typedef quint8 Anonymous;
    typedef quint16 StyleSet;
    typedef qint32 PosX;
    typedef qint32 PosY;
    typedef quint32 SizeX;
    typedef quint32 SizeY;
    typedef quint8 uchar;
    typedef quint16 ushort;
    typedef quint32 uLong;
    typedef qint32 Long;
    typedef QString string;


#define Q_PROPERTY_WITH_WIDGETTYPE(type,name,getter,setter,wtype) \
    private:  type _##name; \
    public: Q_PROPERTY(type name READ getter WRITE setter) \
    public slots:\
        void setter(type  &v) \
        {\
            if(v == _##name)\
                return;\
            _##name = v; \
            v = type::wtype;\
    }\
    public: \
        type & getter() \
            {return _##name;}


#define Q_PROPERTY_WITH_ONOROFF(type,name,getter,setter,informer) \
    private:  type _##name; \
    public: Q_PROPERTY(type name READ getter WRITE setter NOTIFY informer) \
    public slots:\
        void setter(type  &v) \
        {\
            if(v == _##name)\
                return;\
            _##name = v; \
            emit informer(_##name);\
            switch(v){\
                case type::A661_TRUE:setWidgetIdent(99); \
                break;\
                case type::A661_FALSE: setWidgetIdent(24);\
                break; \
            }\
        }\
    public: \
        type & getter() \
            {return _##name;}
//    signals: \
//        void informer(type v);

#define Q_PROPERTY_WITH_INT(type,name,getter,setter) \
    private: name _##name; \
    public: Q_PROPERTY(type name READ getter WRITE setter) \
    name const& getter() const {return _##name;} \
    void setter(name const &v) {_##name = v;}


#define Q_PROPERTY_POSITIONX(type,name,getter,setter) \
    private: name _##name; \
    public: Q_PROPERTY(type name READ getter WRITE setter) \
    name const& getter() const {return _##name;} \
    void setter(name const &v) {_##name = v;\
    this->setGeometry(_##name,this->frameGeometry().y(),frameGeometry().width(),frameGeometry().height());  \
    update();}


#define Q_PROPERTY_POSITIONY(type,name,getter,setter) \
    private: name _##name; \
    public: Q_PROPERTY(type name READ getter WRITE setter) \
    name const& getter() const {return _##name;} \
    void setter(name const &v) {_##name = v;\
    this->setGeometry(this->frameGeometry().x(),_##name,frameGeometry().width(),frameGeometry().height());  \
    update();}

#define Q_PROPERTY_POSITIONW(type,name,getter,setter) \
    private: name _##name; \
    public: Q_PROPERTY(type name READ getter WRITE setter) \
    name const& getter() const {return _##name;} \
    void setter(name const &v) {_##name = v;\
    this->setGeometry(this->frameGeometry().x(),this->frameGeometry().y(),static_cast<int>(_##name),frameGeometry().height());  \
    update();}


#define Q_PROPERTY_POSITIONH(type,name,getter,setter) \
    private: name _##name; \
    public: Q_PROPERTY(type name READ getter WRITE setter) \
    name const& getter() const {return _##name;} \
    void setter(name const &v) {_##name = v;\
    this->setGeometry(this->frameGeometry().x(),this->frameGeometry().y(),frameGeometry().width(),static_cast<int>(_##name));  \
    update();}



//#define Q_PROPERTY_WITH_ENUMTest(type,name,getter,setter,informer) \
//    private:  type _##name; \
//    public: Q_PROPERTY(type name READ getter WRITE setter NOTIFY informer) \
//    public slots: void setter(type  &v) \
//    {\
//        _##name = v; emit informer(_##name);\
//        switch(v){\
//            case type::A661_TRUE:setWidgetType(99); break;\
//            case type::A661_FALSE: setWidgetType(24); break; \
//        }\
//    }\
//    public: type & getter()  {return _##name;}\
//   signals: void informer(type &v);

//#define SIGNALP(type,informer)  \
//    signals: \
//     void informer(type v);



//template <typename T> T getWidgetType()
//{
//    T tmp;
//    return tmp;
//}

}

using namespace my_namespace;
class classB: public QWidget{
    Q_OBJECT
public:
    enum ONOROFF
    {
        A661_FALSE = 0x0000,
        A661_TRUE = 0x0001
    };
    Q_ENUM(ONOROFF)
    Q_DECLARE_FLAGS(Enum_testFlags,ONOROFF)
    Q_FLAG(Enum_testFlags)

    enum WIDGET_LIB
    {
        A661_LABEL = 0x01,
        A661_PICTURE = 0x02
    };
    Q_ENUM(WIDGET_LIB)

    Q_DECLARE_FLAGS(Enum_LibFlags,WIDGET_LIB)
    Q_FLAG(Enum_LibFlags)

};



//    template <typename T> T getWidgetType()
//    {
//        T tmp = this->widgettype;
//        return tmp;
//    }

#endif // MY_NAMESPACE_H

tom_label.h

#ifndef TOM_LABEL_H
#define TOM_LABEL_H

#include <QWidget>
#include <QLabel>
#include "my_namespace.h"



using namespace my_namespace;

class Tom_Label : public QGraphicsView
{
    Q_OBJECT

    Q_PROPERTY_WITH_WIDGETTYPE(classB::WIDGET_LIB,WidgetType,getWidgetType,setWidgetType,A661_LABEL)


    Q_PROPERTY_WITH_INT(int,WidgetIdent,getWidgetIdent,setWidgetIdent)
    Q_PROPERTY_WITH_INT(int,ParentIdent,getParentIdent,setParentIdent)

    Q_PROPERTY_WITH_ONOROFF(classB::ONOROFF,Visible,getVisible,setvisible,testChanged)
    Q_PROPERTY_WITH_ONOROFF(classB::ONOROFF,Anonymous,getAnonymous,setAnonymous,testChanged)

    Q_PROPERTY_WITH_INT(int,StyleSet,getStyleSet,setStyleSet)
    Q_PROPERTY_POSITIONX(int,PosX,getPosX,setPosX)
    Q_PROPERTY_POSITIONY(int,PosY,getPosY,setPosY)
    Q_PROPERTY_POSITIONW(int,SizeX,getSizeX,setSizeX)
    Q_PROPERTY_POSITIONH(int,SizeY,getSizeY,setSizeY)


//    Q_PROPERTY_WITH_ENUMTest(classB::Enum_test,tom,getTest,setTest,testChanged)
//    Q_PROPERTY_WITH_ENUMTest(classB::Enum_test,todm,getTdest,setTdest,testChanged)

    Q_PROPERTY(int MaxStringLength READ getMaxStringLength WRITE setMaxStringLength)
    Q_PROPERTY(int MotionAllowed READ getMotionAllowed WRITE setMotionAllowed)
    Q_PROPERTY(int Font READ getFont WRITE setFont)
    Q_PROPERTY(int ColorIndex READ getColorIndex WRITE setColorIndex)
    Q_PROPERTY(int Alignment READ getAlignment WRITE setAlignment)
    Q_PROPERTY(string LabelString READ getLabelString WRITE setLabelString)
    Q_PROPERTY(int RotationAngle READ getRotationAngle WRITE setRotationAngle)



public:

    ushort getMaxStringLength();
    void setMaxStringLength(ushort maxstringlengt);
    uchar getMotionAllowed();
    void setMotionAllowed(uchar motionallowed);
    uchar getFont();
    void setFont(uchar font);
    uchar getColorIndex();
    void setColorIndex(uchar colorindex);
    uchar getAlignment();
    void setAlignment(uchar alignment);
    string getLabelString();
    void setLabelString(string labelstring);
    Long getRotationAngle();
    void setRotationAngle(Long rotationangle);



private:

    ushort MaxStringLength;
    uchar MotionAllowed;
    uchar Font;
    uchar ColorIndex;
    uchar Alignment;
    Long RotationAngle;
    string LabelString;

public:
    Tom_Label_Label(QWidget *parent = nullptr);
    QGraphicsScene * pScene;
//    void paintEvent(QPaintEvent *pEvent);
signals:
    void testChanged(classB::ONOROFF test);
};

#endif

tom_label.cpp


#include "tom_label.h"

Tom_Label::Tom_Label(QWidget *parent) :
    QGraphicsView(parent)
{

    _WidgetType = classB::A661_LABEL;
    _WidgetIdent = 0;
    _ParentIdent = 0;
    _Visible= classB::A661_TRUE;
    _Anonymous = classB::A661_TRUE;
    _StyleSet = 0;

    _PosX = 0;
    _PosY = 0;
    _SizeX = 70;
    _SizeY = 20;

    MaxStringLength = 80;
    MotionAllowed = 1;
    Font = 1;
    ColorIndex = 1;
    Alignment = 1;
    RotationAngle = 0;


    LabelString = "A661_label";

    pScene = new QGraphicsScene(this);
    pScene->addText(LabelString);

    this->setScene(pScene);
    this->setStyleSheet("background:transparent;border:0px");
    this->rotate(0);
    this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//    this->resize(static_cast<int>(SizeX),static_cast<int>(SizeY));
    this->setGeometry(this->getPosX(),this->getPosY(),static_cast<int>(this->getSizeX()),static_cast<int>(this->getSizeY()));
}


ushort Tom_Label::getMaxStringLength()
{
    return this->MaxStringLength;
}

void Tom_Label::setMaxStringLength(ushort maxstringlengt)
{
    this->MaxStringLength = maxstringlengt;
    update();
}


uchar Tom_Label::getMotionAllowed()
{
    return this->MotionAllowed;
}

void Tom_Label::setMotionAllowed(uchar motionallowed)
{
    this->MotionAllowed = motionallowed;
    update();
}

uchar Tom_Label::getFont()
{
    return this->Font;
}

void Tom_Label::setFont(uchar font)
{
    this->Font = font;
    update();
}



uchar Tom_Label::getColorIndex()
{
    return this->ColorIndex;
}

void Tom_Label::setColorIndex(uchar colorindex)
{
    this->ColorIndex = colorindex;
    update();
}

uchar Tom_Label::getAlignment()
{
    return this->Alignment;
}

void Tom_Label::setAlignment(uchar alignment)
{
    this->Alignment = alignment;
    update();
}


string Tom_Label::getLabelString()
{
    return this->LabelString;
}
void Tom_Label::setLabelString(string labelstring)
{
    this->LabelString = labelstring;
    pScene->clear();
    pScene->addText(labelstring);
    update();
}

Long Tom_Label::getRotationAngle()
{
     return this->RotationAngle;
}

void Tom_Label::setRotationAngle(Long rotationangle)    //此处旋转功能
{
    this->RotationAngle = rotationangle;
    pScene->clear();
    pScene->addText(this->LabelString);
    this->rotate(rotationangle);
    update();
}

//void A661_Label::paintEvent(QPaintEvent *pEvent)
//{

//    QLabel::paintEvent(pEvent);
//    QPainter painter(this);
//    painter.drawText(rect(),Qt::AlignCenter,LabelString);
//    painter.translate(rect().center());
//    painter.rotate(80);
//    painter.translate(-rect().center());
//    painter.drawText(rect(),alignment(),text());

//}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值