重写QTabWidget,在标签后面添加图标按钮

原本的QTabWidget没有支持在标签后面添加自定义的按钮的方法。想在后面添加自定义的功能按钮需要重写QTabWidget类,自己实现按钮图标的重绘和鼠标点击判断等操作。

1、使用到的主要事件函数:

   (1) void paintEvent(QPaintEvent* event);

   用于在QTabWidget标签后面绘制操作按钮

  (2)void mousePressEvent(QMouseEvent * event);

   用于确定鼠标点击,判断点击时鼠标是否在绘制的图标上,在图标上则发出一个自定义的鼠标点击信号

  (3)void mouseMoveEvent(QMouseEvent * event);

   用于实现鼠标移动到操作按钮上方时,执行一些相关操作,如:toolTip提示、鼠标悬停效果切换等等

  (4) void resizeEvent(QResizeEvent * event);

   用于实现当标签数量改变时,操作按钮的位置改变

 2、各个函数实现细节

 (1)void paintEvent(QPaintEvent* event);

  1. void MyTabWidget::paintEvent(QPaintEvent* event)  
  2. {     
  3.     QPainter painter(this);  
  4.     QRect rectAdd(width()-m_tablepic.width(),tabBar()->rect().bottom()-m_tablepic.height()+7,m_tablepic.width(),m_tablepic.height()-5);  
  5.     painter.drawImage(rectAdd,m_tablepic);  
  6.     QTabWidget::paintEvent(event);        
  7. }  
   (2)void mousePressEvent(QMouseEvent * event);
  1. void MyTabWidget::mousePressEvent(QMouseEvent * event)  
  2. {  
  3.     if(event->button()==Qt::LeftButton)  
  4.     {  
  5.         QRect tabRect = tabBar()->rect();  
  6.   
  7.         if(event->pos().y()>=tabRect.top() && event->pos().y()<=tabRect.bottom())   
  8.         {  
  9.             if(event->pos().x()>=width()-m_tablepic.width())  
  10.             {  
  11.                 emit changeWidget();      
  12.             }         
  13.         }  
  14.     }  
  15.     QTabWidget::mousePressEvent(event);  
  16. }  
  (3) void mouseMoveEvent(QMouseEvent * event);
  1. void MyTabWidget::mouseMoveEvent(QMouseEvent * event)  
  2. {  
  3.     QRect tabRect = tabBar()->rect();  
  4.   
  5.     if(event->pos().y()>=tabRect.top() && event->pos().y()<=tabRect.bottom())   
  6.     {  
  7.         if(event->pos().x()>=width()-m_tablepic.width())  
  8.         {  
  9.             int tempx = QCursor::pos().x();  
  10.             int tempy = QCursor::pos().y();  
  11.             QToolTip::showText(QPoint(tempx,tempy),"提示文本");  
  12.         }  
  13.         else  
  14.         {  
  15.             setToolTip("");  
  16.         }  
  17.     }  
  18.     else  
  19.     {  
  20.         setToolTip("");  
  21.     }  
  22.     QTabWidget::mouseMoveEvent(event);  
  23. }  

(4)  void resizeEvent(QResizeEvent * event);
  1. void MyTabWidget::resizeTabBar()  
  2. {  
  3.     int maxWidth = width() - m_tablepic.width();  
  4.     int avgWidth = maxWidth/(tabBar()->count());   
  5.     if(avgWidth>TAB_MAX_WIDTH)  
  6.         avgWidth = TAB_MAX_WIDTH;  
  7.       
  8.   
  9.     QString style = "QTabWidget{background-color:rgb(0,71,67);}\  
  10.                     QTabWidget::pane{border:3px solid rgb(0,71,67);border-top-right-radius:4px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;}\  
  11.                     QTabBar::tab:first{height:"+QString("%0").arg(TAB_HEIGHT)+"px;backgroud-color:rgb(0,71,67);width:80px;backgroud-color:rgb(0,71,67);color:white;border-top-left-radius:4px;border-top-right-radius:4px;}\  
  12.                     QTabBar::tab:selected{background:rgb(0,71,67);}\  
  13.                     QTabBar::tab:!selected{background:rgb(16,96,95);}";  
  14.     QString style1 = "QTabBar::tab{width:"+QString("%0").arg(avgWidth)+"px;height:"+QString("%0").arg(TAB_HEIGHT)+"px;backgroud-color:rgb(0,71,67);color:white;border-top-left-radius:4px;border-top-right-radius:4px;}";  
  15.     QString style2 = "QScrollBar::vertical{background-color:rgb(54,80,79);margin:22px 0 22px 0;}\  
  16.                      QScrollBar::handle:vertical{background-color:rgb(0,71,67);min-height:25px;border-radius:4px;}\  
  17.                      QScrollBar::add-line:vertical{background-color:rgb(0,71,67);height:20px;border-top-left:3px;border-top-right:3px;subcontrol-position:bottom;subcontrol-origin:margin;}\  
  18.                      QScrollBar::sub-line:vertical{background-color:rgb(0,71,67);height:20px;border-bottom-left:3px;border-bottom-right:3px;subcontrol-position:top;subcontrol-origin:margin;}\  
  19.                      QScrollBar::up-arrow:vertical{width:0;height:0;border-width:5px 3px;border-style:solid;border-color:rgb(0,71,67) rgb(0,71,67) rgb(255,255,255)   rgb(0,71,67);}\  
  20.                      QScrollBar::down-arrow:vertical {width:0;height:0;border-width:5px 3px;border-style:solid;border-color:rgb(255,255,255) rgb(0,71,67) rgb(0,71,67)   rgb(0,71,67);}\  
  21.                      QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical{background:none;}\  
  22.                      QScrollBar::horizontal{background-color:rgb(54,80,79);margin:0 22px 0 22px;}\  
  23.                      QScrollBar::handle:horizontal{background-color:rgb(0,71,67);min-width:25px;border-radius:4px;}\  
  24.                      QScrollBar::add-line:horizontal{background-color:rgb(0,71,67);width:20px;border-top-left:3px;border-bottom-left:3px;subcontrol-position:right;subcontrol-origin:margin;}\  
  25.                      QScrollBar::sub-line:horizontal{background-color:rgb(0,71,67);width:20px;border-top-right:3px;border-bottom-right:3px;subcontrol-position:left;subcontrol-origin:margin;}\  
  26.                      QScrollBar::right-arrow:horizontal{width:0;height:0;border-width:3px 5px;border-style:solid;border-color:rgb(0,71,67) rgb(0,71,67) rgb(0,71,67)   rgb(255,255,255);}\  
  27.                      QScrollBar::left-arrow:horizontal {width:0;height:0;border-width:3px 5px;border-style:solid;border-color:rgb(0,71,71) rgb(255,255,255) rgb(0,71,67)   rgb(0,71,67);}\  
  28.                      QScrollBar::add-page:horizontal,QScrollBar::sub-page:horizontal{background:none;}\  
  29.                      QScrollArea{border:0;background:rgb(64,71,71);}";  
  30.     this->setStyleSheet(style+style1+style2);  
  31. }  
  注意:样式风格可以自由的调整



FROM:  http://blog.csdn.net/edward342265143/article/details/41513983



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值