Qt 之QToolButton 实现QQ界面按钮效果
来源:互联网 发布:k60单片机 编辑:程序博客网 时间:2024/05/18 00:04
我们知道在QtDesigner中拖出来的空间都是最原始状态的,样式不是很美观,但是Qt提供了QSS,我们可以对控件设置样式来达到我们想要的效果。因此单独一个控件可以实现多种的样式。我们可以通过继承控件并重写paintEvent可以重绘控件,也可以通过简单地设置样式来达到不一样的效果。当然也可以通过控件的组合来达到我们想要的效果。
看一下QQ的效果:
看一下用Qt实现的效果:
自己P的图,大家可以对照图片参考一下样式
按钮背景
小箭头
不得不佩服QQ的界面,十分美观、漂亮。每一处细节都做的很好。下面来讲解一下如何实现QQ界面联系人群组按钮的实现。
其实实现很简单,继承了QToolButton,添加了样式以及一些控制事件。不过外观不是很美观(可惜不大会PS,完全靠截图和抠图再组合),但是功能基本实现,大家有兴趣可以试试,下面直接上代码。
// 设置按钮图标void MyToolButton::setIcon(QString strIcon){ m_strIcon = strIcon;}//按钮的初始化void MyToolButton::initControl(){ this->setPopupMode(QToolButton::MenuButtonPopup); this->setFixedSize(QSize(45, 34)); // 设置样式 this->setStyleSheet(QString("QToolButton\ {\ border-image: url(%1) 0 0 68 0;\ }\ QToolButton:hover\ {\ border-image: url(%1) 34 0 34 0;\ }\ QToolButton:pressed,QToolButton:checked\ {\ border-image: url(%1) 68 0 0 0;\ }\ QToolButton::menu-arrow\ {\ border:none\ }\ QToolButton::menu-button\ {\ background-image:url(:/Resources/toolButton_arrow_tranparent.png);\ }").arg(m_strIcon)); connect(this, SIGNAL(pressed()), this, SLOT(onMousePress())); // 可以在这个onMousePress槽中实现QQ界面中的联系人、群组、空间等界面的切换;}
// 设置菜单void MyToolButton::initMenu(){ m_menu = new QMenu(this); QAction* actionOne = m_menu->addAction("one"); QAction* actionTwo = m_menu->addAction("two"); this->setMenu(m_menu);}
// 鼠标进出按钮事件void MyToolButton::enterEvent(QEvent *event){ if (this->isChecked()) { showMenuArrow(); } QToolButton::enterEvent(event);}void MyToolButton::leaveEvent(QEvent *event){ hideMenuArrow(); QToolButton::leaveEvent(event);}
// 显示菜单小箭头void MyToolButton::showMenuArrow(){ QString styleSheet = this->styleSheet(); styleSheet += "QToolButton::menu-button\ {\ background-image:url(:/Resources/toolButton_arrow.png);\ }"; this->setStyleSheet(styleSheet);}//隐藏菜单小箭头void MyToolButton::hideMenuArrow(){ QString styleSheet = this->styleSheet(); styleSheet += "QToolButton::menu-button\ {\ background-image:url(:/Resources/toolButton_arrow_tranparent.png);\ }"; this->setStyleSheet(styleSheet);}
以上代码实现了单个按钮的效果,但是还需要将按钮组合起来。以下代码实现了将多个按钮组合,并且控制当一个按钮被按下时,将之前被按下的按钮setChecked(false)。
//初始化void MyTabButton::initControl(){ m_hLayout = new QHBoxLayout(this); m_hLayout->setSpacing(0); MyToolButton* toolButtonOne = new MyToolButton(0, ":/Resources/toolButton.png"); MyToolButton* toolButtonTwo = new MyToolButton(0, ":/Resources/group_contact.png"); MyToolButton* toolButtonThree = new MyToolButton(0, ":/Resources/toolButton.png"); MyToolButton* toolButtonFour = new MyToolButton(0, ":/Resources/group_contact.png"); addToolButton(toolButtonOne); addToolButton(toolButtonTwo); addToolButton(toolButtonThree); addToolButton(toolButtonFour); m_hLayout->addStretch(0); m_checkButtonId = 0; m_tButtonList[0]->setChecked(true); QSignalMapper *signalMap = new QSignalMapper(this); for (int i = 0; i < m_tButtonList.size(); i++) { signalMap->setMapping(m_tButtonList[i], i); connect(m_tButtonList[i], SIGNAL(clicked()), signalMap, SLOT(map())); } connect(signalMap, SIGNAL(mapped(int)), this, SLOT(onToolButtonClicked(int)));}//将按钮添加到ButtonList中void MyTabButton::addToolButton(MyToolButton *myToolButton){ m_hLayout->addWidget(myToolButton); m_tButtonList.push_back(myToolButton);}// 将上一个被按下的按钮setChecked(false);void MyTabButton::onToolButtonClicked(int id){ m_tButtonList[m_checkButtonId]->setChecked(false); m_checkButtonId = id;}
以上是最近模仿 QQ做的一个小例子,最初的想法是用两个button进行组合来实现,一个button充当默认的button另一个button充当小箭头,但是这样显得多余,绞尽脑汁最后还是用一个QToolButton实现了这样的效果。
写了几篇博客才发现,想要真正写完一篇质量高一点的博客不是那么容易,不过还是想用心写好每一篇与大家一起分享。也感谢前辈们写的一篇篇博文,让我们不断学习,也让我们更加自信。欢迎大家一起交流讨论!
进步始于交流,收获源于分享!
虽然能力有限,但努力无极限!
加油!!!
代码下载
QToolButton 的扩展、多样化
4 0
- Qt 之QToolButton 实现QQ界面按钮效果
- [QT]QT教程之实例分析[三] 实现QQ抽屉效果(QToolBox 和QToolButton)
- 实现QQ抽屉效果(QToolBox 和QToolButton)
- 实现QQ抽屉效果(QToolBox 和QToolButton)
- 实现QQ抽屉效果(QToolBox 和QToolButton)
- qt 之QToolButton
- Qt之QToolButton
- qt 之QToolButton
- Qt之QToolButton
- QT实现QQ界面
- Qt 之 QToolButton属性简述
- Qt 之 QToolButton属性简述
- QT之qss教程-QToolButton
- 自学Q之qml实现qq界面动画效果
- Qt 之 QQ系统表情—实现动态显示效果
- Qt+html+JavaScript实现类似QQ聊天界面的气泡效果
- 实现QQ主界面效果[图]
- 实现QQ主界面效果[图]
- 调用相机并将照片存储到sd卡上
- python orm 之 sqlalchemy
- 【计算机组成原理】单周期处理器
- light oj 1118
- 今天我开通了CSDN博客
- Qt 之QToolButton 实现QQ界面按钮效果
- HDU 1711 Number Sequence(KMP模板)
- struts2.5框架使用通配符指定方法常见错误
- 杭电OJ 1097 A hard puzzle(我最后的博客水题报告)
- 为了忘却的纪念
- [Lintcode]Best Time to Buy and Sell Stock
- 服务端ecs使用mongodb
- 获取往后n天的时间信息
- java代码模型5(代理设计模式)