QTabWidget标签实现双击封闭

    添加时间:2013-5-9 点击量:

    用Qt做ARM,发明Qt4中QTabWidget原生的封闭按键(X)太小,用触摸板很难按到。于是乎想到类似于浏览器的双击封闭功能,因为之前做过C#的资料经管器,认为可以直接绑定DoubleClick,可后来翻遍了也没找到响应的SLOT,成果在QWidget中捕获旌旗灯号,就是没有QTabWidget标签的鼠标事务,坑爹那!随后,又在网上各类搜刮,成果找到的是各类题目,每一个正确答复出来的.....最后思来想去,其实不可,就用最笨的办法,仿Hock实现!


    于是乎,我重载了QTabWidget(因为tabBar()是protected,坑爹啊!),如许就可以获取到标签了。



    class Tab : public QTabWidget
    
    {
    Q_OBJECT
    public:
    Tab(QWidget parent = 0);
    QTabBar GetBar();
    protected:
    void mousePressEvent(QMouseEvent event);
    };


    然后在实现一个事务过滤器,起首断定事务是双击事务,然后断定是否为标签地位,若是是则删除当前标签页,因为双击事务中必触发单击,即标签页选中事务,是以无需推敲双击其他标签页引起的index变革题目。



    #ifndef MYEVENTFILTER_H
    
    #define MYEVENTFILTER_H
    #include <QMainWindow>
    #include <QMouseEvent>
    #include tab.h

    extern int tabindex_current;
    extern int tabindex_old;
    extern Tab tabWidget;
    extern QPoint tableft;
    extern int tabwidth;
    extern int tabheight;

    //实现双击封闭Tab标签
    class myEventFilter: public QObject
    {
    public:
    myEventFilter():QObject()
    {};
    ~myEventFilter(){};

    bool eventFilter(QObject object,QEvent event)
    {
    if (event->type()==QEvent::MouseButtonDblClick)
    {
    QMouseEvent e = static_cast<QMouseEvent>(event);
    QPoint pos = e->pos();
    int x1 = tableft.x();
    int x2 = tableft.x()+tabwidth;
    int y1 = tableft.y();
    int y2 = tableft.y()+tabheight;
    if (pos.x() >= x1 && pos.y() >= y1 && pos.x() <= x2 && pos.y() <= y2)
    tabWidget->removeTab(tabindex_current);
    }
    return QObject::eventFilter(object,event);
    };
    };

    #endif // MYEVENTFILTER_H


    最后绑定到主函数main中,如许就可捕获到所有的事务了:



    qApp->installEventFilter(new myEventFilter());
    


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



    void MainWindow::Bar()
    
    {
    tabindex_current = tabWidget->currentIndex();
    tabindex_old = tabindex_current;
    QTabBar bar = tabWidget->GetBar();
    if (bar->size().width() > 0)
    tabwidth = bar->size().width();
    }


      


      

    所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
    分享到: