美文网首页
QT5 基于vsc++2019自定义窗口

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

作者: c之气三段 | 来源:发表于2021-03-16 15:06 被阅读0次

    实现自定义窗口的同时实现项目.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的那种大小和样式做的,亲测还行。

    相关文章

      网友评论

          本文标题:QT5 基于vsc++2019自定义窗口

          本文链接:https://www.haomeiwen.com/subject/fbulcltx.html