Happy coder :Qt 自定义 Button 之美

http://blog.csdn.net/yiyaaixuexi/article/details/6706729


✿题记

上次经理批评我帮同事写现成代码的行为,他说:授之以鱼,不如授之以渔。我想想也对,可是【渔】很枯燥人家不爱学怎么办?

于是乎我想,授之以,不如授之以

✿正文

在不支持qml的Qt 4.6 ,很多时候,需要我们自定义控件。其实自定义一点也不难,并不是要从头开始写一个控件类,而是继承它,在其基础上,加些佐料,锦上添点花。

曾经也有人对我的方案产生了质疑,说qss就可以解决,为什么要费劲自己写?

我想说,第一qss不能解决全部,写一个功能函数无非是3、4行代码的事情,不费劲,同时所有特效都封装在一起,统一管理方便工程中任何一个widget的调用。第二,vim可以打开读文件,为什么还有cat的存在?一个道理,可有其利。第三,对于嵌入式终端的UI实现方案来说,越多越好,在比较下根据实际情况选取最优,因为嵌入式对文件系统大小,库的裁剪要求比较严格。

以Button为例吧,为什么要以Button为例,因为在我看来,Button是万能的,只是看你会不会用。如果把Button属性设置为flat平滑且不可点击,那么它就是个label;如果把许多上述的label按一定的顺序和布局排成行或列,那它就是listview……加载不同背景图片、点击、悬浮、动画、click on槽灵活处理,等等把所有属性都打乱随机组合,没有不能拼凑出的效果和特效。

✿某phone 抽奖小例子

鼠标悬浮于按钮上时,加载诱惑iphone图片,离开加载苹果标,点击加载叹气背景…偷笑



✿其实还可以加载更多


✿My button list鼠标划过


✿随你拖


✿关于自定义Button和特效方法的封装

  1. Button::Button(QWidget *parent) : QPushButton(parent)
  2. {
  3. //保存图片成员初始化
  4. buttonPicture = new QPixmap();
  5. pressPicture = new QPixmap();
  6. releasePicture = new QPixmap();
  7. enterPicture = new QPixmap();
  8. leavePicture = new QPixmap();
  9. //关闭按钮的默认显示
  10. this -> setFlat(true);
  11. this->setFocusPolicy(Qt::NoFocus);
  12. //初始化flag
  13. flag=false;
  14. }
  15. void Button::setButtonPicture(QPixmap pic)
  16. {
  17. *buttonPicture = pic;
  18. this -> setIcon(QIcon(*buttonPicture));
  19. }
  20. void Button::setPressPicture(QPixmap pic)
  21. {
  22. *pressPicture = pic;
  23. }
  24. void Button::setReleasePicture(QPixmap pic)
  25. {
  26. *releasePicture = pic;
  27. }
  28. void Button::setEnterPicture(QPixmap pic)
  29. {
  30. *enterPicture = pic;
  31. }
  32. void Button::setLeavePicture(QPixmap pic)
  33. {
  34. *leavePicture = pic;
  35. }
  36. void Button::set_X_Y_width_height(int x, int y, int width, int height)
  37. {
  38. this -> setIconSize(QSize(width, height));
  39. this -> setGeometry(x, y, width, height);
  40. }
  41. void Button::mouseDoubleClickEvent(QMouseEvent *event)
  42. {
  43. //null
  44. }
  45. void Button::mousePressEvent (QMouseEvent *event)
  46. {
  47. this -> setIcon (QIcon(*pressPicture));
  48. }
  49. void Button::mouseMoveEvent(QMouseEvent *event)
  50. {
  51. //null
  52. }
  53. void Button::mouseReleaseEvent (QMouseEvent *event)
  54. {
  55. this -> setIcon(QIcon(*releasePicture));
  56. emit clicked();
  57. }
  58. void Button::enterEvent(QEvent *)
  59. {
  60. this->setIcon(QIcon(*enterPicture));
  61. flag=true;
  62. // this->resizeit();
  63. }
  64. void Button::leaveEvent(QEvent *)
  65. {
  66. this->setIcon(QIcon(*leavePicture));
  67. flag=false;
  68. }
  69. void Button::resizeit(int w , int h)
  70. {
  71. this->raise();
  72. this->resize(w,h);
  73. this ->setIconSize(QSize(w, h));
  74. }
Button::Button(QWidget *parent) : QPushButton(parent)
{
        //保存图片成员初始化
        buttonPicture = new QPixmap();
        pressPicture = new QPixmap();
        releasePicture = new QPixmap();

        enterPicture = new QPixmap();
        leavePicture = new QPixmap();

        //关闭按钮的默认显示
        this -> setFlat(true);
        this->setFocusPolicy(Qt::NoFocus);

        //初始化flag
        flag=false;


}

void Button::setButtonPicture(QPixmap pic)
{
        *buttonPicture = pic;

        this -> setIcon(QIcon(*buttonPicture));
}

void Button::setPressPicture(QPixmap pic)
{
        *pressPicture = pic;
}

void Button::setReleasePicture(QPixmap pic)
{
        *releasePicture	= pic;
}

void Button::setEnterPicture(QPixmap pic)
{
    *enterPicture = pic;
}

void Button::setLeavePicture(QPixmap pic)
{
    *leavePicture = pic;
}

void Button::set_X_Y_width_height(int x, int y, int width, int height)
{
        this -> setIconSize(QSize(width, height));
        this -> setGeometry(x, y, width, height);
}

void Button::mouseDoubleClickEvent(QMouseEvent *event)
{
        //null
}

void Button::mousePressEvent (QMouseEvent *event)
{
        this -> setIcon (QIcon(*pressPicture));
}

void Button::mouseMoveEvent(QMouseEvent *event)
{
        //null
}


void Button::mouseReleaseEvent (QMouseEvent *event)
{
        this -> setIcon(QIcon(*releasePicture));
        emit clicked();
}

void Button::enterEvent(QEvent *)
{
    this->setIcon(QIcon(*enterPicture));
    flag=true;
  //  this->resizeit();

}

void Button::leaveEvent(QEvent *)
{
    this->setIcon(QIcon(*leavePicture));
    flag=false;
}

void Button::resizeit(int w , int h)
{
    this->raise();
    this->resize(w,h);
    this ->setIconSize(QSize(w, h));

}

把这些方法按照自己的思路,配合paintEvent、Animation、qss等等,美化Qt 应用程序的UI 和动画效果基本没什么问题了。
一时之间想不出还有什么新鲜的需求来写个小demo,就这样吧,欢迎交流。


✿由Button想到的


就一句话:你说什么控件不能自定义啊?


✿后记

兴趣和快乐是进步的动力和源泉

——以渔为娱,以渔为乐,以渔为生活。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值