效果如下:
代码如下:
// widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
bool nativeEvent(const QByteArray&eventType,void *message,long*result) override;
private slots:
void on_close();
private:
void mousePressEvent(QMouseEvent*ev);
void mouseMoveEvent(QMouseEvent*ev);
QPoint pos;
private:
Ui::Widget *ui;
int m_BorderWidth =5;
};
//2、titlebar
#ifndef CTABTITLEWIDGET_H
#define CTABTITLEWIDGET_H
#include <QObject>
#include <QWidget>
#include<QPushButton>
class CTabTitleWidget : public QWidget
{
Q_OBJECT
public:
explicit CTabTitleWidget(QWidget *parent = nullptr);
~CTabTitleWidget();
void setEmptyWidgetWidth(int w);
protected:
void paintEvent(QPaintEvent*event);
void mousePressEvent(QMouseEvent*ev);
void mouseDoubleClickEvent(QMouseEvent*event);
signals:
void sig_close();
void sig_addtab();
private slots:
void on_clicked();
private:
QPushButton* m_pAddBtn = nullptr;
QWidget* m_pEmptyWidget = nullptr;
QPushButton* m_pUserBtn = nullptr;
QPushButton* m_pMinBtn = nullptr;
QPushButton* m_pMaxBtn = nullptr;
QPushButton* m_pCloseBtn = nullptr;
};
#endif // CTABTITLEWIDGET_H
#endif // WIDGET_H
//3.tabbrowser
#ifndef TABBROWSER_H
#define TABBROWSER_H
#include <QObject>
#include <QWidget>
#include <QTabWidget>
#include <QMenu>
#include "ctabtitlewidget.h"
class tabbrowser : public QTabWidget
{
Q_OBJECT
public:
explicit tabbrowser(QWidget *parent = nullptr);
enum TAB_FLAG
{
NEW,
CLOSE,
NORMAL,
SPECIAL
};
protected:
void resizeEvent(QResizeEvent*ev) override;
private:
void initTabWidget();
void setTabBarFlag(TAB_FLAG);
void createTabMenu();
private slots:
void on_newTab();
void on_closeTab(int index);
void onMenuShow(const QPoint&pos);
void on_closeAllTab();
private:
CTabTitleWidget*m_pRightWidget = nullptr;
QMenu* m_pTabMenu = nullptr;
signals:
void sig_close();
};
#endif // TABBROWSER_H
.cpp
/./1.widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "tabbrowser.h"
#ifdef Q_OS_WIN
#include <qt_windows.h>
#include <Windows.h>
#include <windowsx.h>
#include <QHBoxLayout>
#include <QMouseEvent>
#endif
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置窗口为无边框
setWindowFlag(Qt::FramelessWindowHint);
setStyleSheet("background-color:#E3E4E7;");
// 创建一个新的 tabbrowser 实例,并将其设置为此窗口的小部件
tabbrowser* pTab = new tabbrowser(this);