QT下自定义QQ聊天窗口tab控件
来源:互联网 发布:java上传和下载文件 编辑:程序博客网 时间:2024/06/07 07:20
1.用继承pushbutton派生类来实现tab按钮,里面加一个QPushbutton关闭按钮;(自定义类:CCustomTabButton)
2.多个tab按钮用QHboxLayout做容器;
3.用QStackLayout做page容易,保存tab页的widget;
4.从QWidget继承类CCustomTabWidget组合tabbar和page
5.用qss渲染tarbar的效果;
#ifndef CCUSTOMTABWIDGET_H#define CCUSTOMTABWIDGET_H#include <QPushButton>#include <QList>class QLabel;class QStackedLayout;class QHBoxLayout;class CCustomTabButton :public QPushButton{ Q_OBJECTpublic: explicit CCustomTabButton(QWidget *parent = 0); ~CCustomTabButton(); void setText(QString text); void setIndex(int nIndex){ m_nIndex = nIndex; } int getIndex(){ return m_nIndex; }signals: void clicked(int nIndex); void closeClicked(int nIndex);protected: void resizeEvent(QResizeEvent * event); void mousePressEvent(QMouseEvent * event); void enterEvent(QEvent * event ); void leaveEvent(QEvent * event );private slots: void on_btnClose_clicked();private: QPushButton * m_btnClose; int m_nIndex; };class CCustomTabWidget : public QWidget{ Q_OBJECTpublic: explicit CCustomTabWidget(QWidget *parent = 0); ~CCustomTabWidget(); void AddTab(QString title, QWidget *widget); void RemoveTab(int index); void Clear(); void SetCurrentWidget(QWidget *widget); void SetCurrentIndex(int index); int CurrentIndex(); int count() { return m_listTabButton.count(); } QWidget* widget(int nIndex);protected: void paintEvent(QPaintEvent *);signals:private slots: void on_tabbar_closeClicked(int nIndex); void on_tabbar_clicked(int nIndex);private: QList<CCustomTabButton *> m_listTabButton; QHBoxLayout *m_hlTabbar; QLabel *m_lblTabbar; QStackedLayout *m_stackWidget; int m_nCurrentIndex;};#endif // CCUSTOMTABWIDGET_H
#include "ccustomtabwidget.h"#include <QPushButton>#include <QHBoxLayout>#include <QVBoxLayout>#include <QLabel>#include <QStackedLayout>#include <QDebug>#include <QStyleOption>#include <QPainter>CCustomTabButton::CCustomTabButton(QWidget *parent): QPushButton(parent){ this->setCheckable(true); m_btnClose = new QPushButton(this); m_btnClose->setObjectName(QString::fromUtf8("CCustomTabCloseButton")); m_btnClose->setVisible(false); m_btnClose->setGeometry(QRect(this->width()-16,0,16,16)); connect(m_btnClose, SIGNAL(clicked()), this, SLOT(on_btnClose_clicked()));}CCustomTabButton::~CCustomTabButton(){ delete m_btnClose;}void CCustomTabButton::resizeEvent(QResizeEvent * event){ m_btnClose->setGeometry(QRect(this->width()-16,0,16,16));}void CCustomTabButton::mousePressEvent(QMouseEvent * event){ emit clicked(m_nIndex);}void CCustomTabButton::enterEvent ( QEvent * event ){ QPushButton::enterEvent(event); m_btnClose->setVisible(true);}void CCustomTabButton::leaveEvent ( QEvent * event ){ QPushButton::leaveEvent(event); m_btnClose->setVisible(false);}void CCustomTabButton::on_btnClose_clicked(){ emit closeClicked(m_nIndex);}void CCustomTabButton::setText(QString text){ QPushButton::setText(text); this->setToolTip(text);}/*** CCustomTabWidget**/CCustomTabWidget::CCustomTabWidget(QWidget *parent) : QWidget(parent){ QVBoxLayout *vlMain = new QVBoxLayout(); vlMain->setSpacing(0); vlMain->setMargin(0); this->setLayout(vlMain); m_lblTabbar = new QLabel(); m_lblTabbar->setObjectName(QString::fromUtf8("CCustomTabBar")); m_hlTabbar = new QHBoxLayout(); m_hlTabbar->setSpacing(0); m_hlTabbar->setMargin(0); m_hlTabbar->setContentsMargins(5,0,5,0); m_hlTabbar->addStretch(); m_lblTabbar->setLayout(m_hlTabbar); vlMain->addWidget(m_lblTabbar); m_stackWidget = new QStackedLayout(); vlMain->addLayout(m_stackWidget);}CCustomTabWidget::~CCustomTabWidget(){ for (int i = 0; i < m_listTabButton.size(); i++) { delete m_listTabButton.at(i); } m_listTabButton.clear(); for (int i = 0; i < m_stackWidget->count(); i++) { delete m_stackWidget->widget(i); } delete m_lblTabbar; delete m_stackWidget;}void CCustomTabWidget::paintEvent(QPaintEvent *){ QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);}void CCustomTabWidget::on_tabbar_closeClicked(int nIndex){ if (nIndex < 0 || nIndex >= m_listTabButton.size()) { qDebug()<<"CCustomTabWidget::on_tabbar_closeClicked error!!!"<<nIndex; return; } this->RemoveTab(nIndex);}void CCustomTabWidget::on_tabbar_clicked(int nIndex){ if (nIndex < 0 || nIndex >= m_listTabButton.size()) { qDebug()<<"CCustomTabWidget::on_tabbar_clicked error!!!"<<nIndex; return; } this->SetCurrentIndex(nIndex);}QWidget* CCustomTabWidget::widget(int nIndex){ if (nIndex < 0 || nIndex >= m_listTabButton.size()) { return NULL; } return m_stackWidget->widget(nIndex);}void CCustomTabWidget::AddTab(QString title, QWidget *widget){ CCustomTabButton *btn = new CCustomTabButton(); btn->setObjectName(QString::fromUtf8("CCustomTabButton")); connect(btn, SIGNAL(clicked(int)), this, SLOT(on_tabbar_clicked(int))); connect(btn, SIGNAL(closeClicked(int)), this, SLOT(on_tabbar_closeClicked(int))); btn->setText(title); int nIndex = m_listTabButton.size(); btn->setIndex(nIndex); m_hlTabbar->insertWidget(nIndex,btn); m_listTabButton.append(btn); m_stackWidget->addWidget(widget); this->SetCurrentIndex(nIndex);}void CCustomTabWidget::RemoveTab(int index){ if (index < 0 || index >= m_listTabButton.size()) { qDebug()<<"CCustomTabWidget::RemoveTab error!!!"<<index; return; } CCustomTabButton *btn = m_listTabButton.at(index); m_hlTabbar->removeWidget(btn); m_listTabButton.removeAt(index); delete btn; QWidget * widget = m_stackWidget->widget(index); m_stackWidget->removeWidget(widget); delete widget; if (m_listTabButton.size() > 0) { int nCurrIndex = index-1 >= 0?index-1 :0; this->SetCurrentIndex(nCurrIndex); }}void CCustomTabWidget::Clear(){ for (int i = 0; i < m_listTabButton.size(); i++) { m_hlTabbar->removeWidget(m_listTabButton.at(i)); delete m_listTabButton.at(i); } m_listTabButton.clear(); for (int i = 0; i < m_stackWidget->count(); i++) { QWidget *widget = m_stackWidget->widget(0); m_stackWidget->removeWidget(widget); delete widget; }}void CCustomTabWidget::SetCurrentWidget(QWidget *widget){ if (widget == NULL) { return; } for (int i = 0; i < m_stackWidget->count(); i++) { if(m_stackWidget->widget(i) == widget) { this->SetCurrentIndex(i); break; } }}void CCustomTabWidget::SetCurrentIndex(int index){ if (index < 0 || index >= m_listTabButton.size()) { qDebug()<<"CCustomTabWidget::SetCurrentTab error!!!"<<index; return; } m_nCurrentIndex = index; if (m_listTabButton.size() == 1) { m_lblTabbar->setVisible(false); } else { m_lblTabbar->setVisible(true); } for (int i = 0; i < m_listTabButton.size(); i++) { m_listTabButton.at(i)->setIndex(i); m_listTabButton.at(i)->setVisible(true); if (i == m_nCurrentIndex) { m_listTabButton.at(i)->setChecked(true); qDebug()<<"checked:"<<i; } else { m_listTabButton.at(i)->setChecked(false); } } m_stackWidget->setCurrentIndex(m_nCurrentIndex);}int CCustomTabWidget::CurrentIndex(){ return m_nCurrentIndex;}
#CCustomTabButton {max-height:30px; min-height:20px; border-image: url(:/skin/skin/tab_btn_bg_normal.png) 8 8 2 4; border-width:8px 8px 2px 4px;background-color: transparent;color:black;} " "#CCustomTabButton:hover {border-image: url(:/skin/skin/tab_btn_bg_hover.png) 8 8 4 4; border-width:8px 8px 4px 4px;} " "#CCustomTabButton:checked {border-image: url(:/skin/skin/tab_btn_bg_checked.png) 8 8 2 4; border-width:8px 8px 2px 4px;} " "#CCustomTabCloseButton{border-image: url(:/skin/skin/tab_btn_close_normal.png);}" "#CCustomTabCloseButton:hover{border-image: url(:/skin/skin/tab_btn_close_hover.png);}" "#CCustomTabBar{min-height:30px;background:transparent;border-bottom:1px solid #cacaca; } " "CCustomTabWidget{border-image: url(:/skin/skin/tab_bg1.png) 30; border-width:30px;}
Demo下载地址:
http://download.csdn.net/detail/lanhy999/6386437
- QT下自定义QQ聊天窗口tab控件
- QT自定义窗口以及控件
- Qt程序聊天弹屏问题简单解决方法(类似QQ聊天聊天窗口弹屏)
- 模拟QQ聊天窗口
- 调出QQ聊天窗口
- C# 类似qq聊天的群列表成员自定义控件
- Flex打开QQ聊天窗口
- 高仿QQ(聊天窗口)
- qq,skype浮动聊天窗口
- 获取QQ聊天窗口信息
- 网页弹出qq聊天窗口
- js 调用qq聊天窗口
- 修改QQ聊天窗口大小
- QQ聊天列表粘性控件
- 自定义tab bar控件
- 自定义Web Tab控件
- 自定义Tab + ViewPager控件
- 自定义一个分段控件(仿QQ顶部的分段控件)tab切换
- settag跟gettag的两种用法
- andorid基础之点击事件绑定的几种…
- LinearLayout和RelativeLayout&nbs…
- 新浪微博,腾讯微博,腾讯QQ登录
- 【原创】CSS中经常碰到的一些奇怪…
- QT下自定义QQ聊天窗口tab控件
- 太平洋女性网焦点图的几种写法
- java解析json字符串
- JAVA类的继承派生
- android的artdialog的用法
- javascript闭包的个人理解
- jQurey的一点自己代码
- PHPCMS整合UCENTER后登陆问题
- 代码创建storyboard中的窗体