zoukankan      html  css  js  c++  java
  • QTabWidget标签实现双击关闭(转)

    重载了QTabWidget(由于tabBar()是protected),这样就可以获取到标签了。

    1 class Tab : public QTabWidget
    2 {
    3     Q_OBJECT
    4 public:
    5     Tab(QWidget *parent = 0);
    6     QTabBar* GetBar();
    7 protected:
    8     void mousePressEvent(QMouseEvent *event);
    9 };

    然后在实现一个事件过滤器,首先判断事件是双击事件,然后判断是否为标签位置,如果是则删除当前标签页,由于双击事件中必触发单击,即标签页选中事件,因此无需考虑双击其他标签页引起的index变更问题。

     1 #ifndef MYEVENTFILTER_H
     2 #define MYEVENTFILTER_H
     3 #include <QMainWindow>
     4 #include <QMouseEvent>
     5 #include "tab.h"
     6 
     7 extern int tabindex_current;
     8 extern int tabindex_old;
     9 extern Tab *tabWidget;
    10 extern QPoint tableft;
    11 extern int tabwidth;
    12 extern int tabheight;
    13 
    14 //实现双击关闭Tab标签
    15 class myEventFilter: public QObject
    16 {
    17   public:
    18   myEventFilter():QObject()
    19   {};
    20   ~myEventFilter(){};
    21 
    22   bool eventFilter(QObject* object,QEvent* event)
    23   {
    24       if (event->type()==QEvent::MouseButtonDblClick)
    25       {
    26           QMouseEvent *e = static_cast<QMouseEvent*>(event);
    27           QPoint pos = e->pos();
    28           int x1 = tableft.x();
    29           int x2 = tableft.x()+tabwidth;
    30           int y1 = tableft.y();
    31           int y2 = tableft.y()+tabheight;
    32           if (pos.x() >= x1 && pos.y() >= y1 && pos.x() <= x2 && pos.y() <= y2)
    33               tabWidget->removeTab(tabindex_current);
    34       }
    35       return QObject::eventFilter(object,event);
    36   };
    37 };
    38 
    39 #endif // MYEVENTFILTER_H

    最后绑定到主函数main中,这样就可捕捉到所有的事件了:

    1 qApp->installEventFilter(new myEventFilter());

    另外,需在标签页切换时更新宽度信息(高度无需更新):

    1 void MainWindow::updateBar()
    2 {
    3     tabindex_current = tabWidget->currentIndex();
    4     tabindex_old = tabindex_current;
    5     QTabBar *bar = tabWidget->GetBar();
    6     if (bar->size().width() > 0)
    7          tabwidth = bar->size().width();
    8 }
  • 相关阅读:

    暴力求解/数学问题
    Leetcode207. Course Schedule
    Balanced Team
    由先序和中序求后序
    Median String
    树的同构
    uva 202
    整除光棍
    阅览室
  • 原文地址:https://www.cnblogs.com/seer/p/5639036.html
Copyright © 2011-2022 走看看