QT5 基于vsc++2019自定义窗口

2021-03-16  本文已影响0人  c之气三段

实现自定义窗口的同时实现项目.exe图标,任务栏图标,点击任务栏实现最小化,最大化。我们这的流程是先UI界面再事件处理。
上效果:


image.png

那么作为入门级的我们来说是不是需要这种效果喃!

一 、在vs中创建一个ui项目,就是长者这样的。

image.png
image.png

二 、网上的ico和png放进资源

1.这里告诉大家可以在阿里巴巴图标库去找找喜欢的:https://www.iconfont.cn

image.png
image.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的那种大小和样式做的,亲测还行。

上一篇下一篇

猜你喜欢

热点阅读