QpushButton避免焦点虚框

QpushButton避免焦点虚框

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<const QStyleOptionButton *>(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);

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

还有就是运用样式表  setStyleSheet("QPushButton:focus{padding: -20;}"  根据个人需求改变数值的大小。

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

这个时候探寻带来的喜悦冲走了探寻过程中的焦躁,充实了我继续探寻的信心和勇气。
[喝小酒的网摘]http://blog.hehehehehe.cn/a/9749.htm
原文:http://liufiabo.blog.163.com/blog/static/1126637832009916114443120/[喝小酒的网摘]http://blog.hehehehehe.cn/a/9749.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值