QTabWidget拖出拆分窗口,拖入合并窗口,固定标签,关闭标签菜单

本文介绍了一种通过继承QTabWidget并处理鼠标事件,实现标签页拖动拆分窗口及合并窗口的方法。作者提供了详细的实现思路和关键代码片段,包括对QEvent类型的处理,以及右键菜单功能,如关闭左侧、右侧标签等。此外,还支持标签固定和取消固定功能。

一、效果展示

二、实现思路

写一个继承QTabWidget的类TabWidget,通过eventFilter函数对QTabBar的QEvent::MouseButtonPress、QEvent::MouseMove、QEvent::MouseButtonRelease、QEvent::HoverLeave进行处理和对拖出窗口的QEvent::Move事件进行处理达到拖出拆分窗口,拖入合并窗口,固定标签的效果。通过设置QTabBar的右键菜单实现关闭左侧标签、右侧标签、其他标签、固定标签、取消标签等功能,以上功能均在类TabWidget中实现。

三、代码

TabWidget.h

#ifndef TABWIDGET_H
#define TABWIDGET_H

#include <QTabWidget>
#include <QSet>
#include <QMenu>
class TabWidget : public QTabWidget
{
    Q_OBJECT
public:
    TabWidget(QWidget *parent = nullptr);
    void setTabCanMove(int index,bool canMove);
    void setTabsClosable(bool closeable);
    bool tabsClosable() const;
    int addTab(QWidget *page, const QString &label);
    int addTab(QWidget *page, const QIcon &icon, const QString &label);
    int insertTab(int index, QWidget *page, const QString &label);
    int insertTab(int index, QWidget *page, const QIcon &icon, const QString &label);
protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragLeaveEvent(QDragLeaveEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    bool eventFilter(QObject *watched, QEvent *event);
signals:

public slots:
private:
    bool m_tabClosable;
    bool m_isDrag;
    int m_dragIndex;
    int m_xOffset;
    int m_offset;
    bool m_tabBarPress;
    QSet<QWidget*> m_un
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

brain00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值