游戏开发,系统架构; 博客迁移到:http://www.jianshu.com/u/3ac0504b3b8c
全部博文(198)
分类: 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
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/