Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1757657
  • 博文数量: 198
  • 博客积分: 4088
  • 博客等级: 上校
  • 技术积分: 2391
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-15 16:29
个人简介

游戏开发,系统架构; 博客迁移到:http://www.jianshu.com/u/3ac0504b3b8c

文章分类

全部博文(198)

文章存档

2017年(1)

2016年(12)

2015年(1)

2014年(3)

2013年(13)

2012年(18)

2011年(150)

分类: C/C++

2011-07-20 17:42:51

QPushButton是一个推动按钮,通常创建一个按钮后,我们会点击按钮,以响应对应的动作。在一些比较少的情况下,我们会给按钮设置特别样式的背景,使按钮看起来具有自己的风格。

这时候我们使用样式表(stylesheet)来完成我们的背景图片设置,同时我们好药设置一些其他标志,如flat,palette等。Flat表示按钮的边框,设置为真,则边框不显示,默认为假,边缘框是显示的。Palette则是设置字体颜色,边缘效应等,具体参Qt手册。

       好了,我们用下面的代码设置了按钮的背景图片:

QPalette  palette;

       QBrush  brush(QColor(255,255,255));

       palette.setBrush(QPalette::ButtonText,brush);

       QBrush  brushbutton(QColor(0,0,0,0));      //设置为透明

       palette.setBrush(QPalette::Shadow,brushbutton);

       palette.setBrush(QPalette::Button, brushbutton);

       QFont font;

    font.setFamily(QString::fromUtf8("Sans Serif"));

    font.setPointSize(20);

    font.setWeight(50);

       QPushButton  Button(tr("delete this record!"));

       Button.setPalette(palette);

       Button.setFont(font);

      Button.setGeometry(10,10,290,54);

       deleteButton.setFlat(true);

       setStyleSheet("background-image:url(:images/backgroud.png);");

 

到这里,按钮的背景已设置完成,但是,当我们用setFocus()时,也就是焦点转到这个按钮上时,会出现一个虚框(焦点框)。这个虚框有时候是很令人讨厌的。去掉它的方法有两个,一个是设置焦点策略为无焦点,代码如下:

       setFocusPolicy ( Qt::NoFocus );

但是这样就无法接受键盘事件了,为了能接受键盘事件,我们必须另想方法。因为这个虚框是在Qstyle中实现的,我们就得重新实现QStyle,然后设置按钮的style.

class Style : public QWindowsStyle

{

public:

        Style();

       ~Style();

       void drawControl ( ControlElement element, const QStyleOption * option,QPainter * painter, const QWidget * widget = 0 ) const

{

              

      if(element == CE_PushButton) {

        const QStyleOptionButton *b=qstyleoption_cast(option);

                     QStyleOptionButton *btn = (QStyleOptionButton *)b;

                      if (btn) {

                              if (btn->state & State_HasFocus) {

                  btn->state = btn->state ^ State_HasFocus;

                                           }

                      }

            QWindowsStyle::drawControl(element, btn, painter, widget);

                     

               } else {

         QWindowsStyle::drawControl(element, option, painter, widget);

               }

        }

};

 

然后在设置按钮的style

setStyle(new  Style());

 

完成这些工作之后,那个讨厌的虚框还是存在,通过验证后,发现是因为使用了setStyleSheet()造成了虚框的重新绘制。怎么办,这么行不通就换思路,setStyleSheet是用来设置背景图片的,那么我们得找出设置背景图片的另一种方法。前面用到了palette,这个可以设置按钮的背景图片,再试试:

QPixmap  pixmap=QPixmap("/etc/IMP/MT/callagent/images/blackbutton.png");

palette.setBrush(QPalette::Button,QBrush(pixmap));

按钮上什么也没有啊,再看文档,查网络。最后发现了一个最重要的细节没有设置。那就是自动填充背景。

setAutoFillBackground(true);

至此,无虚框的按钮终于出现了。

 

实际的探寻过程要比这里描述的艰难很多,当一个问题在很长时间内解决不了的话,首先在心里上就给人造成了一些影响,有了挫败感,有了放弃的念头,但是自己必须明白,不能放弃,坚信问题一定能解决,所以在效率极低的情况下继续着探寻,当“幸运”降临自己时,得到了自己希望的结果,却在感谢上天的恩赐。其实这个“幸运”是自己辛勤汗水的结晶。

这个时候探寻带来的喜悦冲走了探寻过程中的焦躁,充实了我继续探寻的信心和勇气。

转载地址:http://liufiabo.blog.163.com/blog/static/1126637832009916114443120/

阅读(3492) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~