ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Qt自定义窗口基类

2021-01-08 21:00:12  阅读:288  来源: 互联网

标签:HeadWidget headWidget Qt 自定义 mainLayout void VirtualMoveWidget QWidget 基类


VirtualMoveWidget.h

#ifndef VIRTUALMOVEWIDGET_H
#define VIRTUALMOVEWIDGET_H

#include <QLabel>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QMouseEvent>

class HeadWidget:public QWidget
{
    Q_OBJECT
private:
    QPoint last;
    QLabel* titleIcon;
    QLabel* titleText;
    QPushButton* btnMin;
    QPushButton* btnMax;
    QPushButton* btnClose;
    QHBoxLayout* mainLayout;
public:
    explicit HeadWidget(QWidget *parent = nullptr);
    ~HeadWidget(){};
protected:
    virtual void mousePressEvent(QMouseEvent*);
    virtual void mouseMoveEvent(QMouseEvent*);
    virtual void mouseReleaseEvent(QMouseEvent*);
signals:
    void MaxWidget();
    void HideWidget();
    void CloseWidget();
    void MoveWinPoint(int, int);
};

class VirtualMoveWidget : public QWidget
{
    Q_OBJECT
private:
    HeadWidget *headWidget;
    QWidget* bodyWidget;
    QVBoxLayout* mainLayout;
public:
    explicit VirtualMoveWidget(QWidget *parent = nullptr);
    virtual ~VirtualMoveWidget()=0;
public:
    void SetHeadWidth(int);
signals:
};

#endif // VIRTUALMOVEWIDGET_H

VirtualMoveWidget.cpp

#include "VirtualMoveWidget.h"

HeadWidget::HeadWidget(QWidget *parent)
    : QWidget(parent)
{
    titleIcon=new QLabel;
    titleText=new QLabel;
    btnMin=new QPushButton;
    btnMax=new QPushButton;
    btnClose=new QPushButton;
    mainLayout=new QHBoxLayout;

    titleIcon->setObjectName("titleIcon");
    titleText->setObjectName("titleText");
    btnMin->setObjectName("btnMin");
    btnMax->setObjectName("btnMax");
    btnClose->setObjectName("btnClose");
    this->setObjectName("HeadWidget");

    titleIcon->setFixedSize(25,25);
    titleText->setFixedHeight(25);
    btnMin->setFixedSize(25,25);
    btnMax->setFixedSize(25,25);
    btnClose->setFixedSize(25,25);

    mainLayout->setMargin(5);
    mainLayout->setSpacing(10);
    mainLayout->addWidget(titleIcon);
    mainLayout->addWidget(titleText);
    mainLayout->addStretch(1);
    mainLayout->addWidget(btnMin);
    mainLayout->addWidget(btnMax);
    mainLayout->addWidget(btnClose);
    setLayout(mainLayout);

    connect(btnMin, &QPushButton::clicked, this, [=] (bool){emit HideWidget(); });
    connect(btnMax,&QPushButton::clicked,this,[=](bool){emit MaxWidget();});
    connect(btnClose, &QPushButton::clicked, this, [=] (bool){emit CloseWidget(); });
}
void HeadWidget::mousePressEvent(QMouseEvent *e)
{
    last = e->globalPos();
}

void HeadWidget::mouseMoveEvent(QMouseEvent *e)
{
    if ((last.x() == 0) && (last.y() == 0))
        return;
    int dx = e->globalX() - last.x();
    int dy = e->globalY() - last.y();
    last = e->globalPos();
    emit MoveWinPoint(x() + dx, y() + dy);
}

void HeadWidget::mouseReleaseEvent(QMouseEvent *e)
{
    if ((last.x() == 0) && (last.y() == 0))
        return;
    int dx = e->globalX() - last.x();
    int dy = e->globalY() - last.y();
    emit MoveWinPoint(x() + dx, y() + dy);
}


VirtualMoveWidget::VirtualMoveWidget(QWidget *parent)
    : QWidget(parent)
{
    headWidget=new HeadWidget;
    bodyWidget=new QWidget;
    mainLayout=new QVBoxLayout;
    headWidget->setFixedHeight(30);

    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
    mainLayout->addWidget(headWidget);
    mainLayout->addWidget(bodyWidget);
    setLayout(mainLayout);

    connect(headWidget, &HeadWidget::HideWidget, this, [=] {this->hide(); });
    connect(headWidget, &HeadWidget::CloseWidget, this, [=] {this->close(); });
    connect(headWidget, &HeadWidget::MaxWidget, this, [=] {this->showMaximized(); });
    connect(headWidget, &HeadWidget::MoveWinPoint, this, [=](int x, int y) {move(this->x() + x, this->y() + y); });
}

VirtualMoveWidget::~VirtualMoveWidget()
{
    if(headWidget!=Q_NULLPTR){
        headWidget->deleteLater();
        headWidget=Q_NULLPTR;
    }
    if(bodyWidget!=Q_NULLPTR){
        bodyWidget->deleteLater();
        bodyWidget=Q_NULLPTR;
    }
    if(mainLayout!=Q_NULLPTR){
        mainLayout->deleteLater();
        mainLayout=Q_NULLPTR;
    }
}

void VirtualMoveWidget::SetHeadWidth(int value)
{
    if(headWidget!=Q_NULLPTR){
        headWidget->setFixedHeight(value);
    }
}

使用时,直接继承VirtualMoveWidget类即可

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "VirtualMoveWidget.h"

class Widget : public VirtualMoveWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
};
#endif // WIDGET_H
#include "widget.h"

Widget::Widget(QWidget *parent)
    : VirtualMoveWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint | Qt::Window);
}

Widget::~Widget()
{
}

标签:HeadWidget,headWidget,Qt,自定义,mainLayout,void,VirtualMoveWidget,QWidget,基类
来源: https://blog.csdn.net/youyicc/article/details/112304876

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有