三态按钮(普通态,鼠标停留态,点击态)在设计炫丽界时是很常用的一项功能,但QT并没有直接支持这个功能,只好自己写一个了,通过继承QToolButton实现。


上代码:


[cpp]view plaincopyprint?

#include<QtGui>

classCoolButton:publicQToolButton

{

Q_OBJECT

private:

QIconm_NormalIcon;

QIconm_FocusIcon;

QIconm_PressedIcon;

protected:

voidenterEvent(QEvent*event);

voidleaveEvent(QEvent*event);

voidmousePressEvent(QMouseEvent*event);

voidmouseReleaseEvent(QMouseEvent*event);

public:

CoolButton(QWidget*parent=0);

virtual~CoolButton();

voidSetButtonIcons(constQIcon&normal,

constQIcon&focus=QIcon(),

constQIcon&pressed=QIcon());

};

CoolButton::CoolButton(QWidget*parent)

:QToolButton(parent)

{

//为了让图标看起来自然一点而设置了这两个操作

setDown(false);

setFocusPolicy(Qt::NoFocus);

}

CoolButton::~CoolButton()

{

}

//重载“进入”和“离开”事件,进入时切换为另一个图标,离开时还原

voidCoolButton::enterEvent(QEvent*event)

{

if(isEnabled()&&!m_FocusIcon.isNull())

setIcon(m_FocusIcon);

}

voidCoolButton::leaveEvent(QEvent*event)

{

if(isEnabled())

setIcon(m_NormalIcon);

}

//重载鼠标事件

voidCoolButton::mousePressEvent(QMouseEvent*event)

{

if(isEnabled()&&!m_PressedIcon.isNull())

setIcon(m_PressedIcon);

QToolButton::mousePressEvent(event);

}

voidCoolButton::mouseReleaseEvent(QMouseEvent*event)

{

if(isEnabled()&&m_FocusIcon.isNull())

setIcon(m_FocusIcon);

QToolButton::mouseReleaseEvent(event);

}

voidCoolButton::SetButtonIcons(constQIcon&normal,

constQIcon&focus,constQIcon&pressed)

{

m_NormalIcon=normal;

m_FocusIcon=focus;

m_PressedIcon=pressed;

setIcon(m_NormalIcon);

}

#include"main.moc"

intmain(intargc,char**argv)

{

QApplicationapp(argc,argv);

CoolButton*button=newCoolButton;

//QObject::connect(button,SIGNAL(clicked()),qApp,SLOT(quit()));

button->setIconSize(QSize(40,40));

button->SetButtonIcons(QIcon("normal.png"),QIcon("focus.png"),QIcon("pressed.png"));

button->show();

returnapp.exec();

}