您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ spannerSegments函数代码示例

51自学网 2021-06-03 08:08:41
  C++
这篇教程C++ spannerSegments函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中spannerSegments函数的典型用法代码示例。如果您正苦于以下问题:C++ spannerSegments函数的具体用法?C++ spannerSegments怎么用?C++ spannerSegments使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了spannerSegments函数的30个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: qDeleteAll

void Volta::read(XmlReader& e)      {      qDeleteAll(spannerSegments());      spannerSegments().clear();      e.addSpanner(e.intAttribute("id", -1), this);      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "text")            // obsolete                  setText(e.readElementText());            else if (tag == "endings") {                  QString s = e.readElementText();                  QStringList sl = s.split(",", QString::SkipEmptyParts);                  _endings.clear();                  for (const QString& l : sl) {                        int i = l.simplified().toInt();                        _endings.append(i);                        }                  }            else if (tag == "lineWidth") {                  setLineWidth(Spatium(e.readDouble()));                  lineWidthStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "subtype") {  // obsolete                  int st = e.readInt();                  if (st == 1)                        setEndHook(true);                  }            else if (!TextLineBase::readProperties(e))                  e.unknown();            }      }
开发者ID:AntonioBL,项目名称:MuseScore,代码行数:32,


示例2: foreach

void Hairpin::read(XmlReader& e)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      setId(e.intAttribute("id", -1));      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "subtype")                  _hairpinType = HairpinType(e.readInt());            else if (tag == "lineWidth") {                  setLineWidth(Spatium(e.readDouble()));                  lineWidthStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "hairpinHeight") {                  setHairpinHeight(Spatium(e.readDouble()));                  hairpinHeightStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "hairpinContHeight") {                  setHairpinContHeight(Spatium(e.readDouble()));                  hairpinContHeightStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "veloChange")                  _veloChange = e.readInt();            else if (tag == "dynType")                  _dynRange = DynamicRange(e.readInt());            else if (!SLine::readProperties(e))                  e.unknown();            }      }
开发者ID:BlueMockingbird,项目名称:MuseScore,代码行数:31,


示例3: qDeleteAll

void Ottava::read(XmlReader& e)      {      qDeleteAll(spannerSegments());      spannerSegments().clear();      e.addSpanner(e.intAttribute("id", -1), this);      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "subtype") {                  QString s = e.readElementText();                  bool ok;                  int idx = s.toInt(&ok);                  if (!ok) {                        idx = int(Type::OTTAVA_8VA);                        for (unsigned i = 0; i < sizeof(ottavaDefault)/sizeof(*ottavaDefault); ++i) {                              if (s == ottavaDefault[i].name) {                                    idx = i;                                    break;                                    }                              }                        }                  else if (score()->mscVersion() <= 114) {                        //subtype are now in a different order...                        if (idx == 1)                              idx = 2;                        else if (idx == 2)                              idx = 1;                        }                  setOttavaType(Type(idx));                  }            else if (tag == "numbersOnly") {                  _numbersOnly = e.readInt();                  numbersOnlyStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "lineWidth") {                  setLineWidth(Spatium(e.readDouble()));                  lineWidthStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "lineStyle") {                  setLineStyle(Qt::PenStyle(e.readInt()));                  lineStyleStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "beginSymbol") {                      // obsolete                  beginTextStyle = PropertyStyle::UNSTYLED;                  QString text(e.readElementText());                  setBeginText(QString("<sym>%1</sym>").arg(text[0].isNumber() ? Sym::id2name(SymId(text.toInt())) : text));                  }            else if (tag == "continueSymbol") {                   // obsolete                  continueTextStyle = PropertyStyle::UNSTYLED;                  QString text(e.readElementText());                  setContinueText(QString("<sym>%1</sym>").arg(text[0].isNumber() ? Sym::id2name(SymId(text.toInt())) : text));                  }            else if (!TextLine::readProperties(e))                  e.unknown();            }      if (beginText() != propertyDefault(P_ID::BEGIN_TEXT))            beginTextStyle = PropertyStyle::UNSTYLED;      if (continueText() != propertyDefault(P_ID::CONTINUE_TEXT))            continueTextStyle = PropertyStyle::UNSTYLED;      }
开发者ID:FryderykChopin,项目名称:MuseScore,代码行数:59,


示例4: qDeleteAll

void Ottava::read(XmlReader& e)      {      qDeleteAll(spannerSegments());      spannerSegments().clear();      e.addSpanner(e.intAttribute("id", -1), this);      while (e.readNextStartElement())            readProperties(e);      updateStyledProperties();      }
开发者ID:CombatCube,项目名称:MuseScore,代码行数:9,


示例5: qDeleteAll

void TextLine::read(XmlReader& e)      {      qDeleteAll(spannerSegments());      spannerSegments().clear();      setId(e.intAttribute("id", -1));      while (e.readNextStartElement()) {            if (!readProperties(e))                  e.unknown();            }      }
开发者ID:UIKit0,项目名称:mscoreserver,代码行数:11,


示例6: foreach

void TextLine::read(const QDomElement& de)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      setId(de.attribute("id", "-1").toInt());      for (QDomElement e = de.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) {            if (!readProperties(e))                  domError(e);            }      }
开发者ID:alexkonradi,项目名称:MuseScore,代码行数:11,


示例7: foreach

void SLine::read(XmlReader& e)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      setId(e.intAttribute("id", -1));      while (e.readNextStartElement()) {            if (!SLine::readProperties(e))                  e.unknown();            }      }
开发者ID:Isenbarth,项目名称:MuseScore,代码行数:12,


示例8: toTrillSegment

void Trill::layout()      {      SLine::layout();      if (score() == gscore)            return;      if (spannerSegments().empty())            return;      TrillSegment* ls = toTrillSegment(frontSegment());      if (spannerSegments().empty())            qDebug("Trill: no segments");      if (_accidental)            _accidental->setParent(ls);      }
开发者ID:musescore,项目名称:MuseScore,代码行数:13,


示例9: setEndHook

void Ottava::setOttavaType(OttavaType val){    setEndHook(true);    _ottavaType = val;    const OttavaDefault* def = &ottavaDefault[int(val)];    Spatium hook(score()->styleS(ST_ottavaHook));    SymId id = _numbersOnly ? def->numbersOnlyId : def->id;    if (symIsValid(id)) {        if (beginSymbolStyle == PropertyStyle::STYLED)            setBeginSymbol(id);        if (continueSymbolStyle == PropertyStyle::STYLED)            setContinueSymbol(id);        setBeginSymbolOffset(def->offset);        setContinueSymbolOffset(def->offset);        foreach(SpannerSegment* s, spannerSegments()) {            OttavaSegment* os = static_cast<OttavaSegment*>(s);            os->clearText();        }        delete _beginText;        _beginText = 0;        delete _continueText;        _continueText = 0;    }
开发者ID:pumaprod,项目名称:MuseScore,代码行数:27,


示例10: bbox

QRectF SLine::bbox() const      {      if (spannerSegments().isEmpty())            return QRectF();      else            return segmentAt(0)->bbox();      }
开发者ID:guifre2,项目名称:MuseScore,代码行数:7,


示例11: setEndHook

void Ottava::setOttavaType(OttavaType val)      {      setEndHook(true);      _ottavaType = val;      Spatium hook(score()->styleS(ST_ottavaHook));      SymId id;      if (_numbersOnly)            id = ottavaDefault[int(val)].numbersOnlyId;      else            id = ottavaDefault[int(val)].id;      if (beginSymbolStyle == PropertyStyle::STYLED)            setBeginSymbol(id);      if (continueSymbolStyle == PropertyStyle::STYLED)            setContinueSymbol(id);      setBeginSymbolOffset(ottavaDefault[int(val)].offset);      setContinueSymbolOffset(ottavaDefault[int(val)].offset);      setEndHookHeight(hook * ottavaDefault[int(val)].hookDirection);      setPlacement(ottavaDefault[int(val)].place);      _pitchShift = ottavaDefault[int(val)].shift;      foreach(SpannerSegment* s, spannerSegments()) {            OttavaSegment* os = static_cast<OttavaSegment*>(s);            os->clearText();            }
开发者ID:Jon0,项目名称:MuseScore,代码行数:27,


示例12: spatium

void Trill::layout()      {      qreal _spatium = spatium();      SLine::layout();      if (score() == gscore)            return;      TrillSegment* ls = static_cast<TrillSegment*>(frontSegment());      //      // special case:      // if end segment is first chord/rest segment in measure,      // shorten trill line so it ends at end of previous measure      //      Segment* seg1  = startSegment();      Segment* seg2  = endSegment();      if (seg2         && (seg1->system() == seg2->system())         && (spannerSegments().size() == 1)         && (seg2->tick() == seg2->measure()->tick())         ) {            qreal x1   = seg2->pagePos().x();            Measure* m = seg2->measure()->prevMeasure();            if (m) {                  Segment* s2      = m->last();                  qreal x2         = s2->pagePos().x();                  qreal dx         = x1 - x2 + _spatium * .3;                  ls->setPos2(ls->ipos2() + QPointF(-dx, 0.0));                  ls->layout();                  }            }      if (_accidental)            _accidental->setParent(ls);      }
开发者ID:33akash,项目名称:MuseScore,代码行数:33,


示例13: anchor

void SLine::writeProperties(Xml& xml, const SLine* proto) const      {      Element::writeProperties(xml);      if (_diagonal && (proto == 0 || proto->diagonal() != _diagonal))            xml.tag("diagonal", _diagonal);      if (anchor() != ANCHOR_SEGMENT && (proto == 0 || proto->anchor() != anchor()))            xml.tag("anchor", anchor());      if (score() == gscore) {            // when used as icon            if (!spannerSegments().isEmpty()) {                  LineSegment* s = frontSegment();                  xml.tag("length", s->pos2().x());                  }            else                  xml.tag("length", spatium() * 4);            return;            }      //      // check if user has modified the default layout      //      bool modified = false;      int n = spannerSegments().size();      for (int i = 0; i < n; ++i) {            const LineSegment* seg = segmentAt(i);            if (!seg->userOff().isNull()               || !seg->userOff2().isNull()               || !seg->visible()) {                  modified = true;                  break;                  }            }      if (!modified)            return;      //      // write user modified layout      //      qreal _spatium = spatium();      for (int i = 0; i < n; ++i) {            const LineSegment* seg = segmentAt(i);            xml.stag("Segment");            xml.tag("subtype", seg->subtype());            xml.tag("off2", seg->userOff2() / _spatium);            seg->Element::writeProperties(xml);            xml.etag();            }      }
开发者ID:guifre2,项目名称:MuseScore,代码行数:47,


示例14: foreach

void Hairpin::read(XmlReader& e)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      int id = e.intAttribute("id", -1);      e.addSpanner(id, this);      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "subtype")                  _hairpinType = Type(e.readInt());            else if (tag == "lineWidth") {                  setLineWidth(Spatium(e.readDouble()));                  lineWidthStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "hairpinHeight") {                  setHairpinHeight(Spatium(e.readDouble()));                  hairpinHeightStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "hairpinContHeight") {                  setHairpinContHeight(Spatium(e.readDouble()));                  hairpinContHeightStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "hairpinCircledTip")                  _hairpinCircledTip = e.readInt();            else if (tag == "veloChange")                  _veloChange = e.readInt();            else if (tag == "dynType")                  _dynRange = Dynamic::Range(e.readInt());            else if (tag == "useTextLine")                  _useTextLine = e.readInt();            else if (!TextLine::readProperties(e))                  e.unknown();            }      // add default text to legacy hairpins      if (score()->mscVersion() <= 206 && !_useTextLine) {            bool cresc = _hairpinType == Hairpin::Type::CRESCENDO;            if (!_beginText)                  setBeginText(cresc ? "cresc." : "dim.");            if (!_continueText)                  setContinueText(cresc ? "(cresc.)" : "(dim.)");            }      }
开发者ID:HerbertYu,项目名称:MuseScore,代码行数:47,


示例15: setLen

void SLine::setLen(qreal l)      {      if (spannerSegments().isEmpty())            add(createLineSegment());      LineSegment* s = frontSegment();      s->setPos(QPointF());      s->setPos2(QPointF(l, 0));      }
开发者ID:guifre2,项目名称:MuseScore,代码行数:8,


示例16: bbox

const QRectF& SLine::bbox() const      {      if (spannerSegments().isEmpty())            setbbox(QRectF());      else            setbbox(segmentAt(0)->bbox());      return Element::bbox();      }
开发者ID:madwort,项目名称:MuseScore,代码行数:8,


示例17: foreach

void Trill::read(QDomElement e)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      setId(e.attribute("id", "-1").toInt());      for (e = e.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) {            QString tag(e.tagName());            QString val(e.text());            if (tag == "Accidental") {                  _accidental = new Accidental(score());                  _accidental->read(e);                  }            else if (!SLine::readProperties(e))                  domError(e);            }      }
开发者ID:SSMN,项目名称:MuseScore,代码行数:17,


示例18: removeUnmanaged

void Spanner::removeUnmanaged()      {      for (SpannerSegment* ss : spannerSegments())            if (ss->system()) {//                  ss->system()->remove(ss);                  ss->setSystem(nullptr);                  }      score()->removeUnmanagedSpanner(this);      }
开发者ID:FryderykChopin,项目名称:MuseScore,代码行数:9,


示例19: qDeleteAll

void Trill::read(XmlReader& e)      {      qDeleteAll(spannerSegments());      spannerSegments().clear();      e.addSpanner(e.intAttribute("id", -1), this);      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "subtype")                  setTrillType(e.readElementText());            else if (tag == "Accidental") {                  _accidental = new Accidental(score());                  _accidental->read(e);                  _accidental->setParent(this);                  }            else if (!SLine::readProperties(e))                  e.unknown();            }      }
开发者ID:BartlomiejLewandowski,项目名称:MuseScore,代码行数:19,


示例20: foreach

void Hairpin::read(XmlReader& e)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      setId(e.intAttribute("id", -1));      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "subtype")                  _hairpinType = HairpinType(e.readInt());            else if (tag == "veloChange")                  _veloChange = e.readInt();            else if (tag == "dynType")                  _dynRange = DynamicRange(e.readInt());            else if (!SLine::readProperties(e))                  e.unknown();            }      }
开发者ID:kcuzner,项目名称:MuseScore,代码行数:19,


示例21: foreach

void Spanner::startEdit(MuseScoreView*, const QPointF&)      {      editTick  = _tick;      editTick2 = _tick2;      userOffsets.clear();      userOffsets2.clear();      foreach (SpannerSegment* ss, spannerSegments()) {            userOffsets.push_back(ss->userOff());            userOffsets2.push_back(ss->userOff2());            }
开发者ID:Skibol,项目名称:MuseScore,代码行数:10,


示例22: layout

void Vibrato::layout()      {      SLine::layout();      if (score() == gscore)            return;      if (spannerSegments().empty()) {            qDebug("Vibrato: no segments");            return;            }      }
开发者ID:Jojo-Schmitz,项目名称:MuseScore,代码行数:10,


示例23: qDeleteAll

void Glissando::read(XmlReader& e)      {      qDeleteAll(spannerSegments());      spannerSegments().clear();      e.addSpanner(e.intAttribute("id", -1), this);      _showText = false;      while (e.readNextStartElement()) {            const QStringRef& tag = e.name();            if (tag == "text") {                  _showText = true;                  _text = e.readElementText();                  }            else if (tag == "subtype")                  _glissandoType = Type(e.readInt());            else if (!SLine::readProperties(e))                  e.unknown();            }      }
开发者ID:jpirie,项目名称:MuseScore,代码行数:19,


示例24: qDeleteAll

void Volta::read(XmlReader& e)      {      qDeleteAll(spannerSegments());      spannerSegments().clear();      e.addSpanner(e.intAttribute("id", -1), this);      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "text")            // obsolete                  setText(e.readElementText());            else if (tag == "endings") {                  QString s = e.readElementText();                  QStringList sl = s.split(",", QString::SkipEmptyParts);                  _endings.clear();                  foreach(const QString& l, sl) {                        int i = l.simplified().toInt();                        _endings.append(i);                        }                  }
开发者ID:AdrianShe,项目名称:MuseScore,代码行数:19,


示例25: foreach

void Hairpin::read(XmlReader& e)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      int id = e.intAttribute("id", -1);      e.addSpanner(id, this);      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "subtype")                  setHairpinType(Type(e.readInt()));            else if (tag == "lineWidth") {                  setLineWidth(Spatium(e.readDouble()));                  lineWidthStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "hairpinHeight") {                  setHairpinHeight(Spatium(e.readDouble()));                  hairpinHeightStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "hairpinContHeight") {                  setHairpinContHeight(Spatium(e.readDouble()));                  hairpinContHeightStyle = PropertyStyle::UNSTYLED;                  }            else if (tag == "hairpinCircledTip")                  _hairpinCircledTip = e.readInt();            else if (tag == "veloChange")                  _veloChange = e.readInt();            else if (tag == "dynType")                  _dynRange = Dynamic::Range(e.readInt());            else if (tag == "useTextLine") {      // obsolete                  e.readInt();                  if (hairpinType() == Type::CRESC_HAIRPIN)                        setHairpinType(Type::CRESC_LINE);                  else if (hairpinType() == Type::DECRESC_HAIRPIN)                        setHairpinType(Type::DECRESC_LINE);                  }            else if (!TextLine::readProperties(e))                  e.unknown();            }      }
开发者ID:shredpub,项目名称:MuseScore,代码行数:42,


示例26: foreach

void Volta::read(const QDomElement& de)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      setId(de.attribute("id", "-1").toInt());      for (QDomElement e = de.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) {            const QString& tag(e.tagName());            if (tag == "subtype")                  setSubtype(VoltaType(e.text().toInt()));            else if (tag == "text")            // obsolete                  setText(e.text());            else if (tag == "endings") {                  QString s = e.text();                  QStringList sl = s.split(",", QString::SkipEmptyParts);                  _endings.clear();                  foreach(const QString& l, sl) {                        int i = l.simplified().toInt();                        _endings.append(i);                        }                  }
开发者ID:musescore,项目名称:musescore-old,代码行数:21,


示例27: qDeleteAll

void Volta::read(XmlReader& e)      {      qDeleteAll(spannerSegments());      spannerSegments().clear();      e.addSpanner(e.intAttribute("id", -1), this);      while (e.readNextStartElement()) {            const QStringRef& tag(e.name());            if (tag == "endings") {                  QString s = e.readElementText();                  QStringList sl = s.split(",", QString::SkipEmptyParts);                  _endings.clear();                  for (const QString& l : sl) {                        int i = l.simplified().toInt();                        _endings.append(i);                        }                  }            else if (!TextLineBase::readProperties(e))                  e.unknown();            }      }
开发者ID:akdor1154,项目名称:MuseScore,代码行数:21,


示例28: toTrillSegment

void Trill::layout()      {      SLine::layout();      if (score() == gscore)            return;      if (spannerSegments().empty())            return;      TrillSegment* ls = toTrillSegment(frontSegment());#if 0// this is now handled differently, in SLine::linePos      //      // special case:      // if end segment is first chord/rest segment in measure,      // shorten trill line so it ends at end of previous measure      //      qreal _spatium = spatium();      Segment* seg1  = startSegment();      Segment* seg2  = endSegment();      if (seg1         && seg2         && (seg1->system() == seg2->system())         && (spannerSegments().size() == 1)         && (seg2->tick() == seg2->measure()->tick())         ) {            qreal x1   = seg2->pagePos().x();            Measure* m = seg2->measure()->prevMeasure();            if (m) {                  Segment* s2      = m->last();                  qreal x2         = s2->pagePos().x();                  qreal dx         = x1 - x2 + _spatium * .3;                  ls->setPos2(ls->ipos2() + QPointF(-dx, 0.0));                  ls->layout();                  }            }#endif      if (spannerSegments().empty())            qDebug("Trill: no segments");      if (_accidental)            _accidental->setParent(ls);      }
开发者ID:emeraldimp,项目名称:MuseScore,代码行数:40,


示例29: foreach

void Volta::read(XmlReader* r)      {      foreach(SpannerSegment* seg, spannerSegments())            delete seg;      spannerSegments().clear();      int i= -1;      while (r->readAttribute()) {            if (r->tag() == "id")                  i = r->intValue();            }      setId(i);      while (r->readElement()) {            MString8 tag(r->tag());            if (tag == "endings") {                  QString s = r->stringValue();                  QStringList sl = s.split(",", QString::SkipEmptyParts);                  _endings.clear();                  foreach(const QString& l, sl) {                        int i = l.simplified().toInt();                        _endings.append(i);                        }                  }
开发者ID:SSMN,项目名称:MuseScore,代码行数:23,


示例30: tick2

void Spanner::startEdit(MuseScoreView*, const QPointF&)      {      editTick   = _tick;      editTick2  = tick2();      editTrack2 = _track2;      if (_anchor == Spanner::Anchor::NOTE) {            editEndNote       = static_cast<Note*>(_endElement);            editStartNote     = static_cast<Note*>(_startElement);            }      userOffsets.clear();      userOffsets2.clear();      foreach (SpannerSegment* ss, spannerSegments()) {            userOffsets.push_back(ss->userOff());            userOffsets2.push_back(ss->userOff2());            }
开发者ID:FryderykChopin,项目名称:MuseScore,代码行数:16,



注:本文中的spannerSegments函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ spatium函数代码示例
C++ span_log函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。