一、效果展示

二、实现思路
写一个继承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

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

被折叠的 条评论
为什么被折叠?



