Qt界面美化自定义边框之QMainWindow边框

问题的来源是别人已经写好了一个项目需要界面美化,项目初期构建的时候没有考虑好,最底层的窗口是QMainWindow,由于QMainWindow含有QToolBar和QMenu,在自定义边框的时候无法使用通常的继承QWidget的方法。本文使用了在最底层再创建一个含有自定义边框QWidget来承载所以界面的方法。建议再构建项目的时候尽量使用QWidget继承的方法,后期自定义边框更方便简洁。

下图是自定义边框的效果图。

Qt界面美化自定义边框之QMainWindow边框_第1张图片

以下是代码说明:

首先是main函数,本代码的思路是再MainWindow的下面再放一个带自定义边框的QWidget,所以需要将main的入口改为无边框的QWidget,也就是自定义的类FrameLessWidget。

#include"FrameLessWidget.h"//1*********
#include 

//#include "QssMainWindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //********************************
    //QssMainWindow w;
    //w.show();
    //*********************************
    FrameLessWidget w;
    w.show();
    return a.exec();
}

 进入FrameLessWidget.cpp,再构造函数中创建原项目的QMainWindow,将QMainWindow放进创建的带边框的QWidget,后面就是鼠标事件的重写和按钮的连接,这里就不展开说明。

#include "FrameLessWidget.h"

FrameLessWidget::FrameLessWidget(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	this->resize(800, 600);

	//将MainModle 嵌入到FrameLessWidget中     
	QssMainWindow* m_mainWiondow = new QssMainWindow(this);// 2
	m_mainWiondow->show();
	ui.verticalLayout->insertWidget(1, m_mainWiondow);

	//设置无边框 使用自定义边框
	this->setWindowFlags(Qt::FramelessWindowHint);
	this->setConnectBtn();
	this->InitStyle();
	

}

FrameLessWidget::~FrameLessWidget()
{
	//delete m_mainWiondow;
}

void FrameLessWidget::setConnectBtn()
{
	connect(ui.btnMenu_Max, SIGNAL(clicked()), this, SLOT(onBtnMenuMaxClicked()));
	connect(ui.btnMenu_Min, SIGNAL(clicked()), this, SLOT(onBtnMenuMinClicked()));
	connect(ui.btnMenu_Close, SIGNAL(clicked()), this, SLOT(onBtnMenuCloseClicked()));

}

void FrameLessWidget::InitStyle()
{
	max = false;
	this->location = this->geometry();
	mousePressed = false;

	//安装事件监听器,让标题栏识别鼠标双击
	ui.lab_Title->installEventFilter(this);

	IconHelper::Instance()->SetIcon(ui.btnMenu_Close, QChar(0xf00d), 10);
	IconHelper::Instance()->SetIcon(ui.btnMenu_Max, QChar(0xf096), 10);
	IconHelper::Instance()->SetIcon(ui.btnMenu_Min, QChar(0xf068), 10);
	IconHelper::Instance()->SetIcon(ui.btnMenu, QChar(0xf0c9), 10);
	IconHelper::Instance()->SetIcon(ui.lab_Ico, QChar(0xf015), 12);
}
//关闭 最小化 最大化 三个按钮的槽函数
void FrameLessWidget::onBtnMenuCloseClicked()
{
	this->close();
}
//max location
void FrameLessWidget::onBtnMenuMaxClicked()
{
	if (max) {
		this->setGeometry(location);
		IconHelper::Instance()->SetIcon(ui.btnMenu_Max, QChar(0xf096), 10);
		ui.btnMenu_Max->setToolTip("最大化");
	}
	else {
		QDesktopWidget* desktop = QApplication::desktop();
		int N = desktop->screenCount();
		if (N == 2)
		{
			location = this->geometry();
			this->setGeometry(desktop->screenGeometry(1));
			IconHelper::Instance()->SetIcon(ui.btnMenu_Max, QChar(0xf079), 10);
			ui.btnMenu_Max->setToolTip("还原");

		}
		else {
			location = this->geometry();
			this->setGeometry(qApp->desktop()->availableGeometry());
			IconHelper::Instance()->SetIcon(ui.btnMenu_Max, QChar(0xf079), 10);
			ui.btnMenu_Max->setToolTip("还原");
		}

	}
	max = !max;
}

void FrameLessWidget::onBtnMenuMinClicked()
{
	this->showMinimized();
}
//拖动窗口及双击边框最大化的鼠标时间重写
bool FrameLessWidget::eventFilter(QObject *obj, QEvent *event)
{
	if (event->type() == QEvent::MouseButtonDblClick) {
		this->onBtnMenuMaxClicked();
		return true;
	}
	return QObject::eventFilter(obj, event);
}

void FrameLessWidget::mouseMoveEvent(QMouseEvent *e)
{
	if (mousePressed && (e->buttons() && Qt::LeftButton) && !max) {
		this->move(e->globalPos() - mousePoint);
		e->accept();
	}
}

void FrameLessWidget::mousePressEvent(QMouseEvent *e)
{
	if (e->button() == Qt::LeftButton) {
		mousePressed = true;
		mousePoint = e->globalPos() - this->pos();
		e->accept();
	}
}

void FrameLessWidget::mouseReleaseEvent(QMouseEvent *)
{
	mousePressed = false;
}

 具体的ui界面设计和其他代码参见在已有的QMainWindow中进行自定义边框的界面美化。-QT文档类资源-CSDN下载

你可能感兴趣的:(vs2017+Qt5,qt,开发语言)