Qt自定义标题栏

效果如下:
在这里插入图片描述
代码如下:

// 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);

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值