• 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 }
  • 相关阅读:
    Python进阶-----类、对象的属性的增删改查
    SpringCloud(Finchley版) 服务注册与服务发现-Eureka原理深入
    SpringCloud项目之Eureka 配置 application.yml
    sql 获得各科最高分成绩和人数
    mysql主从同步
    Log4j.properties
    JDBC 配置 jdbc.properties
    Java 通过ant打包时给JS/Jsp/css等文件加上版本号 防止有缓存
    Ant 打包 build文件
    Java zip 压缩包下载excel文件
  • 原文地址:https://www.cnblogs.com/seer/p/5639036.html
Copyright © 2020-2023  润新知