Class NewQCPLineEnding : public QCPLineEnding
{
    Q_GADGET
public:
    enum EndingStyle {esSun = 100, esMoon,  esStar};
    NewQCPLineEnding();
    NewQCPLineEnding(EndingStyle style, double width=8, double length=10, bool inverted=false);
    EndingStyle style() const { return mStyle; }
    void draw(QCPPainter *painter, const QCPVector2D &pos, const QCPVector2D &dir) const {
            ...
           case esSun:
              ...
           break;
           case esMoon:
              ...
           break;
           case esStar:
              ...
           break;
            ...
    }
protected:
    EndingStyle mStyle;
};

class NewQCPItemLine : public QCPItemLine
{
    Q_OBJECT
public:
    explicit NewQCPItemLine(QCustomPlot *parentPlot);
    virtual ~NewQCPItemLine() Q_DECL_OVERRIDE {}
    void setHead(const NewQCPLineEnding & head) { mHead = head;}
    void setTail(const NewQCPLineEnding & tail) { mTail = tail;}

protected:
    WCPLineEnding mHead,mTail;
    virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE {
         if (mTail.style() != static_cast<NewQCPLineEnding::EndingStyle>(QCPLineEnding::esNone))
            mTail.draw(painter, endVec, endVec-startVec);
        if (mHead.style() != static_cast<NewQCPLineEnding::EndingStyle>(QCPLineEnding::esNone))
           mHead.draw(painter, endVec, endVec-startVec);
    }
};



  auto sun  = new NewQCPItemLine(plot);
  sun->setHead(NewQCPLineEnding::esSun);

I've tried it. Is that correct?