目前还没有达到自己满意的地步,魔方别人写的的,先提供参考,后面在加入新的东西
头文件
#ifndef TITLEBAR_H
#define TITLEBAR_H #include <QWidget> class QLabel;
class QPushButton; class TitleBar : public QWidget
{
Q_OBJECT
public:
explicit TitleBar(QWidget *parent = 0);
~TitleBar(); protected:
/*
* 双击标题栏进行界面最大化/还原
*/
virtual void mouseDoubleClickEvent(QMouseEvent *event);
/*
* 进行鼠标界面的拖动
*/
virtual void mousePressEvent(QMouseEvent *event);
/*
* 设置界面标题与图标
*/
virtual bool eventFilter(QObject *watched, QEvent *event); private slots:
/*
* 进行最小化、最大化/还原。关闭操作
*/
void onClicked();
private:
/*
* 最大化/还原
*/
void updateMaximize();
private:
QLabel* m_pIconLabel;
QLabel* m_pTitleLabel;
QPushButton* m_pMiniMizeButton;
QPushButton* m_pMaximizeButton;
QPushButton* m_pCloseButton;
}; #endif // TITLEBAR_H
cpp文件
#include "titlebar.h"
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QEvent>
#include <QMouseEvent>
#include <QApplication>
#include <QSizePolicy>
#include <QIcon>
#ifdef Q_OS_WIN
#pragma comment(lib,"user32.lib")
#include <qt_windows.h>
#endif TitleBar::TitleBar(QWidget *parent) : QWidget(parent)
{
/*
* 设置标题栏高度
*/
this->setFixedHeight(30);
/*
* 初始化标题栏Button及Lable
*/
m_pIconLabel = new QLabel(this);
m_pTitleLabel = new QLabel(this);
m_pMiniMizeButton = new QPushButton(this);
m_pMaximizeButton = new QPushButton(this);
m_pCloseButton = new QPushButton(this); m_pIconLabel->setFixedSize(20,20);
m_pIconLabel->setScaledContents(true); m_pTitleLabel->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); m_pCloseButton->setFixedSize(27,22);
m_pMaximizeButton->setFixedSize(27,22);
m_pMiniMizeButton->setFixedSize(27,22); m_pTitleLabel->setObjectName("whiteLabel");
m_pMiniMizeButton->setObjectName("minimizeButton");
m_pMaximizeButton->setObjectName("maximizeButton");
m_pCloseButton->setObjectName("closeButton"); m_pMaximizeButton->setToolTip("Maximize");
m_pMiniMizeButton->setToolTip("Minimize");
m_pCloseButton->setToolTip("Close"); QHBoxLayout* pLayout = new QHBoxLayout(this);
pLayout->addWidget(m_pIconLabel);
pLayout->addSpacing(5);
pLayout->addWidget(m_pTitleLabel);
pLayout->addWidget(m_pMiniMizeButton);
pLayout->addWidget(m_pMaximizeButton);
pLayout->addWidget(m_pCloseButton);
pLayout->setSpacing(0); this->setLayout(pLayout); connect(m_pMiniMizeButton,SIGNAL(clicked(bool)),this,SLOT(onClicked()));
connect(m_pMaximizeButton,SIGNAL(clicked(bool)),this,SLOT(onClicked()));
connect(m_pCloseButton,SIGNAL(clicked(bool)),this,SLOT(onClicked())); } TitleBar::~TitleBar()
{ } void TitleBar::mouseDoubleClickEvent(QMouseEvent *event)
{
Q_UNUSED(event); emit m_pMaximizeButton->click();
} void TitleBar::mousePressEvent(QMouseEvent *event)
{
#ifdef Q_OS_WIN
if(ReleaseCapture())
{
QWidget* pWindow = this->window();
if(pWindow->isTopLevel())
{
SendMessage(HWND(pWindow->winId()),WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0);
}
}
event->ignore();
#else
#endif } bool TitleBar::eventFilter(QObject *watched, QEvent *event)
{
switch (event->type()) {
case QEvent::WindowTitleChange:
{
QWidget* pWidget = qobject_cast<QWidget*>(watched);
if(pWidget)
{
m_pTitleLabel->setText(pWidget->windowTitle());
return true;
}
}
case QEvent::WindowIconChange:
{
QWidget* pWidget = qobject_cast<QWidget*>(watched);
if(pWidget)
{
QIcon icon = pWidget->windowIcon();
m_pIconLabel->setPixmap(icon.pixmap(m_pIconLabel->size()));
return true;
}
}
case QEvent::WindowStateChange:
case QEvent::Resize:
{
updateMaximize();
return true;
}
}
return QWidget::eventFilter(watched,event);
} void TitleBar::onClicked()
{
QPushButton* pButton = qobject_cast<QPushButton*>(sender());
QWidget* pWidget = this->window();
if(pWidget->isTopLevel())
{
if(pButton == m_pMiniMizeButton)
{
pWidget->showMinimized();
}
else if(pButton == m_pMaximizeButton)
{
pWidget->isMaximized()?pWidget->showNormal():pWidget->showMaximized();
}
else if(pButton == m_pCloseButton)
{
pWidget->close();
}
} } void TitleBar::updateMaximize()
{
QWidget* pWidget = this->window();
if(pWidget->isTopLevel())
{
bool bMaximize = pWidget->isMaximized();
if(bMaximize)
{
m_pMaximizeButton->setToolTip("Restore");
m_pMaximizeButton->setProperty("maximizePorperty","restore");
}
else
{
m_pMaximizeButton->setToolTip("Maximize");
m_pMaximizeButton->setProperty("maximizePorperty","maximize");
}
m_pMaximizeButton->setStyle(QApplication::style());
}
}
使用
#include "widget.h"
#include "ui_widget.h"
#include "titlebar.h"
#include <QPalette>
#include <QVBoxLayout>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); //remove the title bar TitleBar* pTitleBar = new TitleBar(this);
this->installEventFilter(pTitleBar); this->resize(400,300);
this->setWindowTitle("Thunder");
// this->setWindowIcon(QIcon());
QPalette pal(palette());
pal.setColor(QPalette::Background,QColor(50,50,50));
setAutoFillBackground(true);
setPalette(pal); QVBoxLayout *pLayout = new QVBoxLayout();
pLayout->addWidget(pTitleBar);
pLayout->addStretch();
pLayout->setSpacing(0);
pLayout->setContentsMargins(0,0,0,0);
this->setLayout(pLayout); } Widget::~Widget()
{
delete ui;
}
这里的效果还是有问题的,还在排错中