运行截图如下:
这个是工具栏被改造成了标题栏,放大的时候,他也能正常显示。
1.获取屏幕分辨率;
2.重写QToolBar;
3.自定义Label,用于鼠标移动上去造成不同的效果;
关键源码如下:
1.获取分辨率,设置toolBar的大小:
//设置窗口大小
QRect screenRect=QApplication::desktop()->screenGeometry();
setGeometry(100,100,screenRect.width()-100*2,screenRect.height()-100*2);
ui->toolBar->setBarWidth(screenRect.width()-100*2);
ui->toolBar->setBarMaxSize(screenRect.width());
2.关于toolBar的相关代码:
mytitlebar.h
#ifndef MYTITLEBAR_H
#define MYTITLEBAR_H
#include <QToolBar>
class QLabel;
class MyTitleBar : public QToolBar
{
Q_OBJECT
public:
MyTitleBar(QWidget *parent = 0);
void setBarWidth(const int width);
void setBarMaxSize(const int width);
void ChangeTitleSize();
void setTileLabel();
signals:
void prepareToDo(int flag);
protected slots:
void labelSignal(int flag);
private:
int m_width;
int m_maxWidth;
QLabel *titleLabel;
bool titleIsChanged;
};
#endif // MYTITLEBAR_H
mytitlebar.cpp
#include "mytitlebar.h"
#include "mylabel.h"
#include "allmacro.h"
#include <QLabel>
#include <QDebug>
#include <QGraphicsDropShadowEffect>
MyTitleBar::MyTitleBar(QWidget *parent) : QToolBar(parent)
{
m_width=100;
this->setMaximumHeight(33);
titleIsChanged=false;
}
void MyTitleBar::setBarWidth(const int width)
{
m_width=width;
}
void MyTitleBar::setBarMaxSize(const int width)
{
m_maxWidth=width;
}
void MyTitleBar::ChangeTitleSize()
{
qDebug()<<titleIsChanged;
if(!titleIsChanged){
titleLabel->setFixedWidth(m_maxWidth-32*4.5);
}
else{
titleLabel->setFixedWidth(m_width-32*4.5);
}
titleIsChanged=!titleIsChanged;
}
void MyTitleBar::setTileLabel()
{
//QLabel仅仅是提供测试
QLabel *LogoLabel=new QLabel;
LogoLabel->setPixmap(QPixmap(":/img/icon.png").scaled(32,32));
this->addWidget(LogoLabel);
titleLabel=new QLabel;
titleLabel->setText(" 子区域负荷曲线配置");
titleLabel->setFixedWidth(m_width-32*4.5);
this->addWidget(titleLabel);
MyLabel *minsizeLabel=new MyLabel(MinSize,":/img/minisize.png",":/img/minisize_hover.png");
minsizeLabel->setPixmap(QPixmap(":/img/minisize.png"));
this->addWidget(minsizeLabel);
MyLabel *maxsizeLabel=new MyLabel(MaxSize,":/img/maxsize.png",":/img/maxsize_hover.png");
maxsizeLabel->setPixmap(QPixmap(":/img/maxsize.png").scaled(32,32));
this->addWidget(maxsizeLabel);
MyLabel *closeLabel=new MyLabel(CloseMACRO,":/img/close.png",":/img/close_hover.png");
closeLabel->setPixmap(QPixmap(":/img/close.png").scaled(32,32));
this->addWidget(closeLabel);
connect(minsizeLabel,SIGNAL(prepareToDo(int)),this,SLOT(labelSignal(int)));
connect(maxsizeLabel,SIGNAL(prepareToDo(int)),this,SLOT(labelSignal(int)));
connect(closeLabel,SIGNAL(prepareToDo(int)),this,SLOT(labelSignal(int)));
QGraphicsDropShadowEffect *defaultShadow_LogoLabel = new QGraphicsDropShadowEffect();
defaultShadow_LogoLabel->setBlurRadius(9.0);
defaultShadow_LogoLabel->setColor(QColor(0, 0, 0, 160));
defaultShadow_LogoLabel->setOffset(4.0);
LogoLabel->setGraphicsEffect(defaultShadow_LogoLabel);
QGraphicsDropShadowEffect *defaultShadow_titleLabel = new QGraphicsDropShadowEffect();
defaultShadow_titleLabel->setBlurRadius(9.0);
defaultShadow_titleLabel->setColor(QColor(0, 0, 0, 160));
defaultShadow_titleLabel->setOffset(4.0);
titleLabel->setGraphicsEffect(defaultShadow_titleLabel);
}
void MyTitleBar::labelSignal(int flag)
{
emit prepareToDo(flag);
}
对于自定义控件MyLabel的代码
mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
QT_BEGIN_NAMESPACE
class QPixmap;
QT_END_NAMESPACE
class MyLabel : public QLabel
{
Q_OBJECT
public:
MyLabel(QWidget *parent = 0);
MyLabel(const int flag,const QString image,const QString image_hover,QWidget *parent=0);
void getFlag(const int flag);
protected:
void paintEvent(QPaintEvent *event)Q_DECL_OVERRIDE;
void enterEvent(QEvent *event)Q_DECL_OVERRIDE;
void leaveEvent(QEvent *event)Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *event)Q_DECL_OVERRIDE;
signals:
void prepareToDo(int flag);
private:
int m_flag;
QPixmap *m_image;
QPixmap *m_image_hover;
bool mouseIsHover;
};
#endif // MYLABEL_H
mylabel.cpp
#include "mylabel.h"
#include <QPixmap>
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
m_flag=-1;
this->setFixedSize(32,32);
}
MyLabel::MyLabel(const int flag, const QString image, const QString image_hover, QWidget *parent):QLabel(parent)
{
m_flag=flag;
m_image=new QPixmap(image);
m_image_hover=new QPixmap(image_hover);
this->setFixedSize(32,32);
mouseIsHover=false;
}
void MyLabel::getFlag(const int flag)
{
m_flag=flag;
}
void MyLabel::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter patiner(this);
patiner.save();
if(!mouseIsHover){
patiner.drawPixmap(0,0,(*m_image).scaled(32,32));
}
else{
patiner.drawPixmap(0,0,(*m_image_hover).scaled(32,32));
}
patiner.restore();
}
void MyLabel::enterEvent(QEvent *event)
{
Q_UNUSED(event)
mouseIsHover=true;
update();
}
void MyLabel::leaveEvent(QEvent *event)
{
Q_UNUSED(event)
mouseIsHover=false;
update();
}
void MyLabel::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event)
emit prepareToDo(m_flag);
}
mainWindow如何处理这些信号:
要有如下宏
#ifndef ALLMACRO_H
#define ALLMACRO_H
#define MinSize 0
#define MaxSize 1
#define CloseMACRO 2
#define AreaDefine 3
#define Candevice 4
#endif // ALLMACRO_H
然后进行这样的处理:
void SubAreaCurve::labelToDoSth(int flag)
{
if(flag==CloseMACRO){
this->close();
}
else if(flag==MaxSize){
if(windowState()==Qt::WindowNoState){
this->showMaximized();
ui->toolBar->ChangeTitleSize();
}
else{
showNormal();
setWindowsSizeNormal();
ui->toolBar->ChangeTitleSize();
}
}
else if(flag==MinSize){
this->showMinimized();
}
}