Qt修改QMainWindow的标题栏样式

Qt修改QMainWindow的标题栏样式

  • 自定义标题栏样式

  • 效果图
    请添加图片描述

  • 代码展示

class WidgetBase : public QWidget
{
	Q_OBJECT
public:
	explicit WidgetBase(QWidget *parent = 0);
};

class TitleStyle : public QWidget
{
    Q_OBJECT

public:
    TitleStyle(QWidget *parent = nullptr);
    ~TitleStyle();

	void SetTitleContent(const char* pContent);

public slots:
	void OnMin();
	void OnMax();
	void OnClose();

protected:
	virtual void mouseDoubleClickEvent(QMouseEvent *event);
	virtual void mousePressEvent(QMouseEvent *event);
	virtual bool eventFilter(QObject *obj, QEvent *event);

private:
	void InitSignalSlot();
	void InitSytleSheet();
private:
	Ui::TitleStyleClass ui;
};
#include "TitleStyle.h"
#include <QMouseEvent>
#include <windows.h>

TitleStyle::TitleStyle(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

	InitSignalSlot();

	InitSytleSheet();
}

TitleStyle::~TitleStyle()
{}


void TitleStyle::SetTitleContent(const char* pContent)
{
	if (pContent)
	{
		ui.lblTitle->setText(QString::fromLocal8Bit(pContent));
	}
}

void TitleStyle::OnMin()
{
	QWidget *pWindow = this->window();
	if (pWindow->isWindow())
	{
		pWindow->showMinimized();
	}
}

void TitleStyle::OnMax()
{
	QWidget *pWindow = this->window();
	if (pWindow->isWindow())
	{
		pWindow->isMaximized() ? pWindow->showNormal() : pWindow->showMaximized();
	}
}

void TitleStyle::OnClose()
{
	QWidget *pWindow = this->window();
	if (pWindow->isWindow())
	{
		pWindow->close();
	}
}

void TitleStyle::mouseDoubleClickEvent(QMouseEvent *event)
{
	Q_UNUSED(event);
	emit ui.btnMax->clicked();
}

void TitleStyle::mousePressEvent(QMouseEvent *event)
{
	if (ReleaseCapture())
	{
		QWidget *pWindow = this->window();
		if (pWindow->isWindow())
		{
			SendMessage(HWND(pWindow->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
		}
	}
	event->ignore();
}

bool TitleStyle::eventFilter(QObject *obj, QEvent *event)
{
	switch (event->type())
	{
	case QEvent::WindowTitleChange:
	{
		QWidget *pWidget = qobject_cast<QWidget *>(obj);
		if (pWidget)
		{
			ui.lblTitle->setText(pWidget->windowTitle());
			return true;
		}
	}
	case QEvent::WindowIconChange:
	{
		QWidget *pWidget = qobject_cast<QWidget *>(obj);
		if (pWidget)
		{
			QIcon icon = pWidget->windowIcon();
			ui.lblIcon->setPixmap(icon.pixmap(ui.lblIcon->size()));
			return true;
		}
	}
	case QEvent::WindowStateChange:
	case QEvent::Resize:
	{
		return true;
	}
	default:
	{
		return false;
	}
	}
	return QWidget::eventFilter(obj, event);
}

void TitleStyle::InitSignalSlot()
{
	connect(ui.btnMin, SIGNAL(clicked()), this, SLOT(OnMin()));
	connect(ui.btnMax, SIGNAL(clicked()), this, SLOT(OnMax()));
	connect(ui.btnClose, SIGNAL(clicked()), this, SLOT(OnClose()));
}

void TitleStyle::InitSytleSheet()
{
	ui.btnMin->setIcon(QIcon(":/image/image/btnMin.png"));
	ui.btnMax->setIcon(QIcon(":/image/image/btnMax.png"));
	ui.btnClose->setIcon(QIcon(":/image/image/btnClose.png"));

	ui.lblIcon->setScaledContents(true);
	ui.lblIcon->setPixmap(QPixmap(":/image/image/lblIcon.png"));
	
	ui.lblTitle->setStyleSheet("color: #FF96DB");

	ui.widget->setStyleSheet("background-color: rgb(85, 170, 0);");
}

WidgetBase::WidgetBase(QWidget *parent /*= 0*/)
{

}
  • 主窗口调用
QtWidgetsApplication6::QtWidgetsApplication6(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	WidgetBase *pTopWindow = new WidgetBase();
	pTopWindow->setWindowFlags(Qt::FramelessWindowHint);

	this->setParent(pTopWindow);
	TitleStyle *pTitleWidget = new TitleStyle(pTopWindow);
	pTitleWidget->SetTitleContent("测试程序");
	pTopWindow->setSizePolicy(this->sizePolicy());
	pTopWindow->setMaximumSize(this->maximumSize());
	pTopWindow->setMaximumSize(this->maximumSize());

	this->installEventFilter(pTitleWidget);
	QGridLayout *pLayout = new QGridLayout();
	pLayout->addWidget(pTitleWidget);
	pLayout->addWidget(this);
	pLayout->setSpacing(0);
	pLayout->setContentsMargins(0, 0, 0, 0);
	pTopWindow->setLayout(pLayout);

	pTopWindow->show();
}
  • 需要自己用Qt Designer创建一个布局界面,如下图:
    请添加图片描述
  • 标记自己学习
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值