• 15090阅读
  • 20回复

Qt编写自定义控件一开关按钮 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2016-11-06
从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ360卫士、金山毒霸等,都有很多开关控制一些操作,在Qt widgets应用项目上,在项目中应用些类似的开关按钮,估计也会为项目增添不少新鲜感。
总结了大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度要求比较高,但是灵活性比较好。第二类是贴图,专业的美工做好的各种状态的背景图片,只需要用代码将该图片画到界面上即可。为了能够涵盖两大类的开关按钮,特意将常见的四种类型(圆角矩形/内圆形/外圆形/图片)都集成到了自定义的开关按钮中。

运行效果:



1:纯代码绘制
纯代码绘制开关按钮,可以很灵活的设置各种颜色、间隔、文字等,还可以产生动画过度的滑动效果。
产生滑动效果采用定时器绘制的方式,自动计算滑块的X轴开始坐标,当滑块的X轴开始坐标到达滑块的X轴结束坐标时停止定时器。
  1. void SwitchButton::updateValue()
  2. {
  3.     if (checked) {
  4.         if (startX < endX) {
  5.             startX = startX + step;
  6.         } else {
  7.             startX = endX;
  8.             timer->stop();
  9.         }
  10.     } else {
  11.         if (startX > endX) {
  12.             startX = startX - step;
  13.         } else {
  14.             startX = endX;
  15.             timer->stop();
  16.         }
  17.     }
  18.     update();
  19. }



2:贴图绘制
  1. void SwitchButton::drawImage(QPainter *painter)
  2. {
  3.     painter->save();
  4.     QPixmap pix;
  5.     if (!checked) {
  6.         pix = QPixmap(imageOff);
  7.     } else {
  8.         pix = QPixmap(imageOn);
  9.     }
  10.     //自动等比例平滑缩放居中显示
  11.     int targetWidth = pix.width();
  12.     int targetHeight = pix.height();
  13.     pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  14.     int pixX = rect().center().x() - targetWidth / 2;
  15.     int pixY = rect().center().y() - targetHeight / 2;
  16.     QPoint point(pixX, pixY);
  17.     painter->drawPixmap(point, pix);
  18.     painter->restore();
  19. }


有些人说PS一张精美的图片也不是很容易,需要专业的,这里推荐一个好方法,让你也可以获取到这些图片,其实大部分的APP都可以用解压软件打开,拓展名改为.zip即可,解压出来一般里面都含有绝大部分的图片,发现绝大部分的APP都喜欢用图片作为背景来展示一些效果,而不是原原本本的用代码一点点绘制。腾讯就是腾讯啊,大公司!人家的美工MM设计的图片那真的没得话说,绝对一流,手机QQ每次升级一个版本,我都会下过来将里面的精美图片图标之类的提取出来,以便项目使用。同时还推荐两个网站:http://www.easyicon.net/ 我的所有项目用到的ico图标都是这网站上面的。http://www.ui.cn/专业的设计师集中营,这里面成千上万的精美的设计的图片,可以多多参考。

完整代码:

switchbutton.h
  1. #ifndef SWITCHBUTTON_H
  2. #define SWITCHBUTTON_H
  3. /**
  4. * 作者:feiyangqingyun(QQ:517216493) 2016-11-6
  5. * 1:可设置开关按钮的样式 圆角矩形/内圆形/外圆形/图片
  6. * 2:可设置选中和未选中时的背景颜色
  7. * 3:可设置选中和未选中时的滑块颜色
  8. * 4:可设置显示的文本
  9. * 5:可设置滑块离背景的间隔
  10. * 6:可设置圆角角度
  11. */
  12. #include <QWidget>
  13. class QTimer;
  14. class SwitchButton: public QWidget
  15. {
  16.     Q_OBJECT
  17. public:
  18.     enum ButtonStyle {
  19.         ButtonStyle_Rect = 0,     //圆角矩形
  20.         ButtonStyle_CircleIn = 1, //内圆形
  21.         ButtonStyle_CircleOut = 2,//外圆形
  22.         ButtonStyle_Image = 3     //图片
  23.     };
  24.     SwitchButton(QWidget *parent = 0);
  25.     ~SwitchButton();
  26. protected:
  27.     void mousePressEvent(QMouseEvent *);
  28.     void resizeEvent(QResizeEvent *);
  29.     void paintEvent(QPaintEvent *);
  30.     void drawBg(QPainter *painter);
  31.     void drawSlider(QPainter *painter);
  32.     void drawText(QPainter *painter);
  33.     void drawImage(QPainter *painter);
  34. private:
  35.     bool checked;               //是否选中
  36.     ButtonStyle buttonStyle;    //开关按钮样式
  37.     QColor bgColorOff;          //关闭时背景颜色
  38.     QColor bgColorOn;           //打开时背景颜色
  39.     QColor sliderColorOff;      //关闭时滑块颜色
  40.     QColor sliderColorOn;       //打开时滑块颜色
  41.     QColor textColorOff;        //关闭时文本颜色
  42.     QColor textColorOn;         //打开时文本颜色
  43.     QString textOff;            //关闭时显示的文字
  44.     QString textOn;             //打开时显示的文字
  45.     QString imageOff;           //关闭时显示的图片
  46.     QString imageOn;            //打开时显示的图片
  47.     int space;                  //滑块离背景间隔
  48.     int rectRadius;             //圆角角度
  49.     int step;                   //每次移动的步长
  50.     int startX;                 //滑块开始X轴坐标
  51.     int endX;                   //滑块结束X轴坐标
  52.     QTimer *timer;              //定时器绘制
  53. private slots:
  54.     void updateValue();
  55. public:
  56.     bool getChecked()const
  57.     {
  58.         return checked;
  59.     }
  60.     ButtonStyle getButtonStyle()const
  61.     {
  62.         return buttonStyle;
  63.     }
  64.     QColor getBgColorOff()const
  65.     {
  66.         return bgColorOff;
  67.     }
  68.     QColor getBgColorOn()const
  69.     {
  70.         return bgColorOn;
  71.     }
  72.     QColor getSliderColorOff()const
  73.     {
  74.         return sliderColorOff;
  75.     }
  76.     QColor getSliderColorOn()const
  77.     {
  78.         return sliderColorOn;
  79.     }
  80.     QColor getTextColorOff()const
  81.     {
  82.         return textColorOff;
  83.     }
  84.     QColor getTextColorOn()const
  85.     {
  86.         return textColorOn;
  87.     }
  88.     QString getTextOff()const
  89.     {
  90.         return textOff;
  91.     }
  92.     QString getTextOn()const
  93.     {
  94.         return textOn;
  95.     }
  96.     QString getImageOff()const
  97.     {
  98.         return imageOff;
  99.     }
  100.     QString getImageOn()const
  101.     {
  102.         return imageOn;
  103.     }
  104.     int getSpace()const
  105.     {
  106.         return space;
  107.     }
  108.     int getRectRadius()const
  109.     {
  110.         return rectRadius;
  111.     }
  112. public slots:
  113.     //设置是否选中
  114.     void setChecked(bool checked);
  115.     //设置风格样式
  116.     void setButtonStyle(ButtonStyle buttonStyle);
  117.     //设置背景颜色
  118.     void setBgColor(QColor bgColorOff, QColor bgColorOn);
  119.     //设置滑块颜色
  120.     void setSliderColor(QColor sliderColorOff, QColor sliderColorOn);
  121.     //设置文本颜色
  122.     void setTextColor(QColor textColorOff, QColor textColorOn);
  123.     //设置文本
  124.     void setText(QString textOff, QString textOn);
  125.     //设置背景图片
  126.     void setImage(QString imageOff, QString imageOn);
  127.     //设置间隔
  128.     void setSpace(int space);
  129.     //设置圆角角度
  130.     void setRectRadius(int rectRadius);
  131. signals:
  132.     void checkedChanged(bool checked);
  133. };
  134. #endif // SWITCHBUTTON_H

switchbutton.cpp
  1. #include "switchbutton.h"
  2. #include "qpainter.h"
  3. #include "qevent.h"
  4. #include "qtimer.h"
  5. #include "qdebug.h"
  6. SwitchButton::SwitchButton(QWidget *parent): QWidget(parent)
  7. {
  8.     checked = false;
  9.     buttonStyle    = ButtonStyle_Rect;
  10.     bgColorOff = QColor(225, 225, 225);
  11.     bgColorOn = QColor(250, 250, 250);
  12.     sliderColorOff = QColor(100, 100, 100);
  13.     sliderColorOn = QColor(100, 184, 255);
  14.     textColorOff = QColor(255, 255, 255);
  15.     textColorOn = QColor(10, 10, 10);
  16.     textOff = "";
  17.     textOn = "";
  18.     imageOff = ":/image/btncheckoff1.png";
  19.     imageOn = ":/image/btncheckon1.png";
  20.     space = 2;
  21.     rectRadius = 5;
  22.     step = width() / 50;
  23.     startX = 0;
  24.     endX = 0;
  25.     timer = new QTimer(this);
  26.     timer->setInterval(5);
  27.     connect(timer, SIGNAL(timeout()), this, SLOT(updateValue()));
  28.     setFont(QFont("Microsoft Yahei", 10));
  29. }
  30. SwitchButton::~SwitchButton()
  31. {
  32. }
  33. void SwitchButton::mousePressEvent(QMouseEvent *)
  34. {
  35.     checked = !checked;
  36.     emit checkedChanged(checked);
  37.     //每次移动的步长为宽度的 50分之一
  38.     step = width() / 50;
  39.     //状态切换改变后自动计算终点坐标
  40.     if (checked) {
  41.         if (buttonStyle == ButtonStyle_Rect) {
  42.             endX = width() - width() / 2;
  43.         } else if (buttonStyle == ButtonStyle_CircleIn) {
  44.             endX = width() - height();
  45.         } else if (buttonStyle == ButtonStyle_CircleOut) {
  46.             endX = width() - height() + space;
  47.         }
  48.     } else {
  49.         endX = 0;
  50.     }
  51.     timer->start();
  52. }
  53. void SwitchButton::resizeEvent(QResizeEvent *)
  54. {
  55.     //每次移动的步长为宽度的 50分之一
  56.     step = width() / 50;
  57.     //尺寸大小改变后自动设置起点坐标为终点
  58.     if (checked) {
  59.         if (buttonStyle == ButtonStyle_Rect) {
  60.             startX = width() - width() / 2;
  61.         } else if (buttonStyle == ButtonStyle_CircleIn) {
  62.             startX = width() - height();
  63.         } else if (buttonStyle == ButtonStyle_CircleOut) {
  64.             startX = width() - height() + space;
  65.         }
  66.     } else {
  67.         startX = 0;
  68.     }
  69.     update();
  70. }
  71. void SwitchButton::paintEvent(QPaintEvent *)
  72. {
  73.     //绘制准备工作,启用反锯齿
  74.     QPainter painter(this);
  75.     painter.setRenderHint(QPainter::Antialiasing);
  76.     if (buttonStyle == ButtonStyle_Image) {
  77.         //绘制图片
  78.         drawImage(&painter);
  79.     } else {
  80.         //绘制背景
  81.         drawBg(&painter);
  82.         //绘制滑块
  83.         drawSlider(&painter);
  84.         //绘制文字
  85.         drawText(&painter);
  86.     }
  87. }
  88. void SwitchButton::drawBg(QPainter *painter)
  89. {
  90.     painter->save();
  91.     painter->setPen(Qt::NoPen);
  92.     if (!checked) {
  93.         painter->setBrush(bgColorOff);
  94.     } else {
  95.         painter->setBrush(bgColorOn);
  96.     }
  97.     if (buttonStyle == ButtonStyle_Rect) {
  98.         painter->drawRoundedRect(rect(), rectRadius, rectRadius);
  99.     } else if (buttonStyle == ButtonStyle_CircleIn) {
  100.         QRect rect(0, 0, width(), height());
  101.         //半径为高度的一半
  102.         int radius = rect.height() / 2;
  103.         //圆的宽度为高度
  104.         int circleWidth = rect.height();
  105.         QPainterPath path;
  106.         path.moveTo(radius, rect.left());
  107.         path.arcTo(QRectF(rect.left(), rect.top(), circleWidth, circleWidth), 90, 180);
  108.         path.lineTo(rect.width() - radius, rect.height());
  109.         path.arcTo(QRectF(rect.width() - rect.height(), rect.top(), circleWidth, circleWidth), 270, 180);
  110.         path.lineTo(radius, rect.top());
  111.         painter->drawPath(path);
  112.     } else if (buttonStyle == ButtonStyle_CircleOut) {
  113.         QRect rect(space, space, width() - space * 2, height() - space * 2);
  114.         painter->drawRoundedRect(rect, rectRadius, rectRadius);
  115.     }
  116.     painter->restore();
  117. }
  118. void SwitchButton::drawSlider(QPainter *painter)
  119. {
  120.     painter->save();
  121.     painter->setPen(Qt::NoPen);
  122.     if (!checked) {
  123.         painter->setBrush(sliderColorOff);
  124.     } else {
  125.         painter->setBrush(sliderColorOn);
  126.     }
  127.     if (buttonStyle == ButtonStyle_Rect) {
  128.         int sliderWidth = width() / 2 - space * 2;
  129.         int sliderHeight = height() - space * 2;
  130.         QRect sliderRect(startX + space, space, sliderWidth , sliderHeight);
  131.         painter->drawRoundedRect(sliderRect, rectRadius, rectRadius);
  132.     } else if (buttonStyle == ButtonStyle_CircleIn) {
  133.         QRect rect(0, 0, width(), height());
  134.         int sliderWidth = rect.height() - space * 2;
  135.         QRect sliderRect(startX + space, space, sliderWidth, sliderWidth);
  136.         painter->drawEllipse(sliderRect);
  137.     } else if (buttonStyle == ButtonStyle_CircleOut) {
  138.         QRect rect(0, 0, width() - space, height() - space);
  139.         int sliderWidth = rect.height();
  140.         QRect sliderRect(startX, space / 2, sliderWidth, sliderWidth);
  141.         painter->drawEllipse(sliderRect);
  142.     }
  143.     painter->restore();
  144. }
  145. void SwitchButton::drawText(QPainter *painter)
  146. {
  147.     painter->save();
  148.     if (!checked) {
  149.         painter->setPen(textColorOff);
  150.         painter->drawText(width() / 2, 0, width() / 2 - space, height(), Qt::AlignCenter, textOff);
  151.     } else {
  152.         painter->setPen(textColorOn);
  153.         painter->drawText(0, 0, width() / 2 + space * 2, height(), Qt::AlignCenter, textOn);
  154.     }
  155.     painter->restore();
  156. }
  157. void SwitchButton::drawImage(QPainter *painter)
  158. {
  159.     painter->save();
  160.     QPixmap pix;
  161.     if (!checked) {
  162.         pix = QPixmap(imageOff);
  163.     } else {
  164.         pix = QPixmap(imageOn);
  165.     }
  166.     //自动等比例平滑缩放居中显示
  167.     int targetWidth = pix.width();
  168.     int targetHeight = pix.height();
  169.     pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  170.     int pixX = rect().center().x() - targetWidth / 2;
  171.     int pixY = rect().center().y() - targetHeight / 2;
  172.     QPoint point(pixX, pixY);
  173.     painter->drawPixmap(point, pix);
  174.     painter->restore();
  175. }
  176. void SwitchButton::updateValue()
  177. {
  178.     if (checked) {
  179.         if (startX < endX) {
  180.             startX = startX + step;
  181.         } else {
  182.             startX = endX;
  183.             timer->stop();
  184.         }
  185.     } else {
  186.         if (startX > endX) {
  187.             startX = startX - step;
  188.         } else {
  189.             startX = endX;
  190.             timer->stop();
  191.         }
  192.     }
  193.     update();
  194. }
  195. void SwitchButton::setChecked(bool checked)
  196. {
  197.     if (this->checked != checked) {
  198.         this->checked = checked;
  199.         emit checkedChanged(checked);
  200.         update();
  201.     }
  202. }
  203. void SwitchButton::setButtonStyle(SwitchButton::ButtonStyle buttonStyle)
  204. {
  205.     this->buttonStyle = buttonStyle;
  206.     update();
  207. }
  208. void SwitchButton::setBgColor(QColor bgColorOff, QColor bgColorOn)
  209. {
  210.     this->bgColorOff = bgColorOff;
  211.     this->bgColorOn = bgColorOn;
  212.     update();
  213. }
  214. void SwitchButton::setSliderColor(QColor sliderColorOff, QColor sliderColorOn)
  215. {
  216.     this->sliderColorOff = sliderColorOff;
  217.     this->sliderColorOn = sliderColorOn;
  218.     update();
  219. }
  220. void SwitchButton::setTextColor(QColor textColorOff, QColor textColorOn)
  221. {
  222.     this->textColorOff = textColorOff;
  223.     this->textColorOn = textColorOn;
  224.     update();
  225. }
  226. void SwitchButton::setText(QString textOff, QString textOn)
  227. {
  228.     this->textOff = textOff;
  229.     this->textOn = textOn;
  230.     update();
  231. }
  232. void SwitchButton::setImage(QString imageOff, QString imageOn)
  233. {
  234.     this->imageOff = imageOff;
  235.     this->imageOn = imageOn;
  236.     update();
  237. }
  238. void SwitchButton::setSpace(int space)
  239. {
  240.     this->space = space;
  241.     update();
  242. }
  243. void SwitchButton::setRectRadius(int rectRadius)
  244. {
  245.     this->rectRadius = rectRadius;
  246.     update();
  247. }


此自定义控件集成在QFramework中。
自定义控件可执行文件下载:http://pan.baidu.com/s/1i5iCfzv

QFramework简介:
QFramework是一套通用的Qt程序开发框架,集成主界面布局、各种自定义控件、数据处理、excel极速导出、数据打印、串口通信、网络通信、协议解析、全局热键、邮件发送,短信发送,百度地图调用、ffmpeg+vlc处理等功能,将常用的功能封装成类库,提供统一直观的调用接口,方便使用者使用,对应封装的库都有对应的demo程序。QQ:517216493

QFramework基本功能:
1:支持从4.7.0到5.7.0的任何Qt版本,不受版本限制。用了此框架,不会再有Qt版本不同而引起的程序编译通不过的烦恼。
2:极速导出数据到excel,支持表格数据或者查询的数据,不依赖任何组件,支持任何excel、wps等表格软件版本,导出10万行数据8个字段只需要3秒完成。对导出的表格样式可自定义主标题和副标题,可对导出的数据按照指定条件红色突出显示
3:数据导出到pdf及打印功能,支持表格数据或者查询的数据,支持横向纵向打印,自动分页。
4:数据分页dbapi类,只需传入表格对象,表名,翻页按钮即可。无需再写重复的方法处理翻页。
5:各种自定义控件,例如开关按钮、发光按钮,仪表盘控件、音量控件、温湿度控件、仪表仪器类控件等。
6:全新超级中英双拼输入法,非常适合触摸设备。
7:全局热键处理。
8:串口热敏打印机打印。
9:qcustomplot 2D图形曲线绘制(含鼠标数据跟踪)。
10:多线程邮件发送,支持多个接收邮箱。
11:多线程短信发送,支持多个接收号码及长短信。
12:Qffmpeg+Qvlc视频处理。
13:取字模,字符转LED数据处理。
14:全局日志输出类 applog,可动态挂载和卸载。
15:全局程序控制类 appkey,可控制程序的使用时间、运行时间、设备数量限制等。
16:封装百度地图调用接口,支持设备标注、路线查询、位置显示等。
17:自动清理程序早期数据类 cleanapi,传入要清理的数据库表名,执行间隔,保留的最大记录数即可。这样保证了整个系统存储的都是最新的数据。
18:NTP校时服务程序。
19:全局截图处理,可以很方便的直接在ARM上对程序进行截图。
20:程序存活检测功能 applive,通过udp通信实时发送心跳命令,这样可以保证程序7*24小时运行,在ARM上可采用appdog看门狗程序。
21:已运行时间+当前时间+实时CPU使用率+实时内存使用率等。
22:自定义程序主界面底部信息。
23:Echart图表的交互使用。
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线nigoole

只看该作者 1楼 发表于: 2016-11-06
  
有句话说得好:好好学习,天天向上。加油~~!有上船的朋友联系企鹅393320854
离线尽途

只看该作者 2楼 发表于: 2016-11-06
如何做到的 ,能发布一下源文件吗?

离线z278930050

只看该作者 3楼 发表于: 2016-11-06
支持大神
离线greedysky

只看该作者 4楼 发表于: 2016-11-07
用qss很容易实现
Where there is a will, there is a way.
离线liudianwu

只看该作者 5楼 发表于: 2016-11-07
回 greedysky 的帖子
greedysky:用qss很容易实现 (2016-11-07 14:41) 

qss实现不了其中的动画过渡效果!
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线stlcours

只看该作者 6楼 发表于: 2016-11-07
回 liudianwu 的帖子
liudianwu:qss实现不了其中的动画过渡效果! (2016-11-07 16:47) 

那过渡动画到底是怎么实现的??
离线greedysky

只看该作者 7楼 发表于: 2016-11-07
回 stlcours 的帖子
stlcours:那过渡动画到底是怎么实现的?? (2016-11-07 17:33) 

看代码是定时器,不是动画组件
Where there is a will, there is a way.
离线clickto

只看该作者 8楼 发表于: 2016-11-08
回 尽途 的帖子
尽途:如何做到的 ,能发布一下源文件吗?
 (2016-11-06 18:45) 

刘大师已经公布了源码啊
离线arlyb

只看该作者 9楼 发表于: 2016-11-08
赞一个!
离线mu_de_yu

只看该作者 10楼 发表于: 2016-11-12
首先给刘大师一万个赞
我将其开源代码修改了下,可以实现如下样式(源代码对圆在外算法有点问题):


修改详细如下:
代码61行和82行,均修改为:    
          endX = width() - height();
代码168 - 170行,修改为:    
          int sliderWidth = this->height();
          Rect sliderRect(startX, 0, sliderWidth, sliderWidth);  
完事,然后就可以做出以上样式按钮了
离线mu_de_yu

只看该作者 11楼 发表于: 2016-11-12
对上文的补充,增加修改,第139行改为:
         QRect rect(height()/2, space, width() - height(), height() - space * 2);

只看该作者 12楼 发表于: 2016-11-14
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线xiewangdong

只看该作者 13楼 发表于: 2016-11-15
好厉害啊
离线xiewangdong

只看该作者 14楼 发表于: 2016-11-15
QFramework是第三方库吗?还是QT原生库?
在哪里能下载使用啊?
离线liudianwu

只看该作者 15楼 发表于: 2016-11-15
回 xiewangdong 的帖子
xiewangdong:QFramework是第三方库吗?还是QT原生库?
在哪里能下载使用啊? (2016-11-15 19:56) 

是我整理的一套通用开发库!
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线wangfei9618

只看该作者 16楼 发表于: 2016-11-18
QFramework在哪里下载呢
离线xiaoniede

只看该作者 17楼 发表于: 2016-12-23
给力,积少成多,多谢大师分享。
离线cy_ygs

只看该作者 18楼 发表于: 2016-12-27
好资料,学习下
离线shf1986

只看该作者 19楼 发表于: 2017-01-11
向大神学习学习......
QQ:173409750
Atmel SAMA5D3x(QQ群:476153000)
TI AM335x(QQ群:275644633)
Qualcomm/NXP/Freescale iMX6(QQ群:47768065)
嵌入式Qt、MySQL(QQ群:437438881)
离线殇雪寒

只看该作者 20楼 发表于: 2017-07-07
刘大师,你好厉害
快速回复
限100 字节
 
上一个 下一个