实现自定义窗口的同时实现项目.exe图标,任务栏图标,点击任务栏实现最小化,最大化。我们这的流程是先UI界面再事件处理。
上效果:
image.png
那么作为入门级的我们来说是不是需要这种效果喃!
一 、在vs中创建一个ui项目,就是长者这样的。
image.pngimage.png
二 、网上的ico和png放进资源
1.这里告诉大家可以在阿里巴巴图标库去找找喜欢的:https://www.iconfont.cn
image.pngimage.png
这样就下载好了图标哦,背景图百度上随便找就行了。
2.打开项目资源文件
image.png把所有的图标图片全部放进去。
image.png
3.添加qt项目资源
双击.qrc,这里说一下vsc++人性化的把如.rc和.pro都给我们做好了我们现在完全不用管那边。
image.png
image.png
到了add相信你一看就会操作了,然后点保存,资源文件就生效了。
用的时候点这里需要的哪个图,就会出来相关的资源路径复制就好。
4.去网上生成一张.ico都标签作为状态栏的图标
生成.ico:http://www.bitbug.net
同样的加到资源里来。这里可以看到我们最终效果,.exe的图标、状态栏的图标和页面里的logo都是一样的。
5.这里.exe的图标跟代码无关,我们就先搞它。
image.png当然我们的资源都在Resources目录下,这样只能找到.ico文件,导入进来就完工了。
image.png
这样运行项目后目录中的.exe文件就是带图标的。
三、好了环境搭建完毕上代码:
由于我们隐藏自带的标题栏后,可以从ui工具直接编辑按钮,但是如果这么干,每次写项目自定义的时候都要走自己做按钮的流程,而且还会被这个窗口类影响布局,为了以后不影响布局,且不用重写达到直接复制代码的目的。我采用的是把我们这个ui窗口添加到另外一个窗口中,ui窗口给设置成透明,也就是新建一个窗口作为背景,这样ui的操作都和这个窗口分离了。ui添加控件他的深度就在背景之上。
1.新建一个窗口类
注意使用ui窗口的那个类我们什么也没做。
PWindouw.h
class PWindow:public QWidget
{
Q_OBJECT
public:
PWindow(QWidget* parent = 0);
~PWindow();
protected://重写鼠标事件函数,达到拖动窗口的目的
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseMoveEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
private:
bool isMousePressed;//鼠标是否按下
QPoint mousePosition;//鼠标点击位置
int Qwdith=600,Qhight=400;//窗口的默认宽度高度
int bunWidth = 30;//添加的关闭,最小化,设置,按钮的默认宽度
int pointToRightBar=0;//距离窗口最右侧的距离,这几个按钮是从右边开始布局的
void initWindow();//加载新添加的基窗口,也就是这个类的窗口
void initUi();//项目自己生成的ui窗口
void setTitle();//设置标题栏的图标和标题名
QToolButton* addTitleBar(QToolButton* bun, QIcon icon, const char* toolTip);//槽函数需要的按键
};
PWindouw.cpp
#include "stdafx.h"
#include "PWindow.h"
#include"QtGuiApplication1.h"
PWindow::PWindow(QWidget* parent) :QWidget(parent) {
initWindow();
setTitle();
initUi();
QToolButton* closeButton = new QToolButton(this);//构建关闭按钮
QIcon closeIcon(":/titleCoin/Resources/close.png");//获取关闭按钮图标"
connect(addTitleBar(closeButton, closeIcon,"关闭"), &QToolButton::clicked, this, &PWindow::close);
QToolButton* minimizeButton = new QToolButton(this);
QIcon minimizeIcon(":/titleCoin/Resources/min.png");
connect(addTitleBar(minimizeButton, minimizeIcon,"最小化"), &QToolButton::clicked, this, &PWindow::showMinimized);
QToolButton* setButton = new QToolButton(this);
QIcon setIcon(":/titleCoin/Resources/set.png");
connect(addTitleBar(setButton, setIcon,"设置"), &QToolButton::clicked, this, &PWindow::showMinimized);//需要实现这个方法
}
PWindow::~PWindow() {
}
void PWindow::initWindow() {
setWindowIcon(QIcon(":/titleCoin/Resources/bitbug_favicon.ico"));//设置状态栏的图标
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);//隐藏原来的标题栏,这里参数必须完整。
this->resize(Qwdith, Qhight);
QPixmap background(":/titleCoin/Resources/background.jpg");
QPalette palette(this->palette());
background= background.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio);//设置缩放
palette.setBrush(QPalette::Window, QBrush(background));//设置刷屏
this->setPalette(palette);//启动调色板作画
}
void PWindow::setTitle(){
QLabel* labelPix = new QLabel(this);//添加标签
QPixmap pixTitle(":/titleCoin/Resources/lemo.png");
labelPix->setPixmap(pixTitle);//把图片放入标签
labelPix->setScaledContents(true);//设置图片随标签大小自动缩放
labelPix->setGeometry(10, 10, 40, 40);//设置标签大小和位置,不确定看个人需求
QLabel* labelText = new QLabel(this);
QFont ft("Microsoft YaHei", 15);//设置字体
labelText->setFont(ft);
QPalette pa;
pa.setColor(QPalette::WindowText, QColor("#F7F9FE"));//设置字体颜色,这里偏白
labelText->setPalette(pa);
labelText->setText("柠檬");
labelText->adjustSize();
labelText->move(55,15);//这里图标和标题位置不好确定,因为自己需求不同,可以自己调整
}
void PWindow::initUi() {
QtGuiApplication1* ui = new QtGuiApplication1(this);//把当前窗口设置成ui的父窗口。
ui->setWindowFlags(Qt::FramelessWindowHint);//隐藏ui的标题栏,因为windows窗口状态栏的事件和他无关,一个参数就够了。
ui->resize(Qwdith, Qhight);
ui->setWindowOpacity(0.0);//透明度,直接透明原因就是显示背景
}
QToolButton* PWindow::addTitleBar(QToolButton* bun, QIcon icon, const char* toolTip) {//添加按钮的通用函数
pointToRightBar += bunWidth;
bun->setIcon(icon);
bun->setGeometry(this->width() - pointToRightBar, 0, bunWidth, bunWidth);//设置关闭按钮在界面的位置
bun->setToolTip(tr(toolTip)); //设置鼠标移至按钮上的提示信息,如关闭,最小化。
bun->setStyleSheet("QToolButton{background-color: transparent;}""QToolButton:hover{background-color: rgba(200,200,200,0.5);}"
);//鼠标放上去,会变半透明,来提示选中
return bun;//返回按钮给槽函数接收
}
void PWindow::mousePressEvent(QMouseEvent* event) {//自定义拖动窗口三件套
mousePosition = event->pos();
if (mousePosition.x() <= 0|| mousePosition.x()>= Qwdith || mousePosition.y() <= 0|| mousePosition.y() >= Qwdith) { return ; }
isMousePressed = true;
}
void PWindow::mouseMoveEvent(QMouseEvent* event){
if (isMousePressed == true)
{
QPoint topLeftPoint = event->globalPos() - mousePosition;
move(topLeftPoint);
}
}
void PWindow::mouseReleaseEvent(QMouseEvent* event) {
isMousePressed = false;
}
2.最后main函数最一点改动
#include "stdafx.h"
#include "QtGuiApplication1.h"
#include <QtWidgets/QApplication>
#include "PWindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PWindow w;//这里改成我们写的窗口
w.show();
return a.exec();
}
我是对比qq的那种大小和样式做的,亲测还行。
网友评论