【QT 网络云盘客户端】——主窗口界面的设计

2023-10-27

目录

1.设计主窗口界面 

 2.设置窗口的背景图片

3. 自定义标题栏 

3.1 设置toolbutton按钮的图片 

3.2 设置按钮的大小

3.3 将自定义标题栏添加设置到主页面中

 3.4 去除窗口的原标题栏

 3.5 设置按钮颜色

3.6 切换页面功能实现

4.我的文件页面的设计

4.1 菜单栏的设计

4.2 自定义菜单栏

4.3 设置菜单项中的槽函数

 5.共享列表窗口的设计

6.传输列表窗口的设计

 7. 切换用户功能的实现

完整代码链接


当登录成功后,客户端会弹出一个主界面,这个主界面如下的功能如下:

 

 

1.设计主窗口界面 

1.主界面类型是一个将它定义为mainwindows类型,它是一个QMainWindow的类型

2.mainwindows的ui界面如下

widget是用来显示自定义标题栏的,stackWidget是可以用来显示多个页面。 

stackedWidget 添加3个页面,分别是 ”我的文件“,”共享列表“,”传输列表“ , 

注意:stackedWidget 的新添页面不能够单独的删除它。

 

 

 2.设置窗口的背景图片

没有设置背景色的窗口如下:

 设置背景色就需要 重写paintEvent,将对应的图片用QPainter显示出来。

 ps:窗口在显示的时候,就会调用paintEvent。



//MainWindow.cpp文件
void MainWindow::paintEvent(QPaintEvent*)
{
    QPainter* painter=new QPainter(this);
    QPixmap pixmap;
    pixmap.load(":/res/bk_page.png");
    painter->drawPixmap(0,0,this->width(),this->height(),pixmap);
    painter->end();
}

显示效果: 

3. 自定义标题栏 

创建一个buttongroup的对象,它的界面是一个QWidget界面即可,将多个 toolbutton按钮 添加到这个界面中,并设置按钮的图片和文字。

注意

如下是buttongroup.ui文件中的宽度不能大于mainwindows的宽度。

 

3.1 设置toolbutton按钮的图片 

1.将对应的图片添加到 资源路径 中,找到 按钮的 属性页-> icon->添加图片

注意:不要在样式表中添加图片,如果在 样式表添加图片,不能够使文字放在图片下面

2.将文字设置进图片的下面,找到 toolButtonStyle,将按钮的类型设ToolButtonTextUnderIcon。

3.2 设置按钮的大小

找到按钮的属性值,一如果按钮太小,设置minimumSize,如果按钮太大,设置maximumSize

 

3.3 将自定义标题栏添加设置到主页面中

鼠标右键点击mainwindows中最上面的窗口QWidget,点击 "提升为" 按钮。

添加自定义窗口的类名称,选择对应的类,点击提升即可.

 

显示窗口:

 3.4 去除窗口的原标题栏

 在构造函数中添加代码:

this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());

 

 3.5 设置按钮颜色

当我们点击到对应的按钮的时候,按钮就会显示白色其余的按钮就会显示黑色。 

 步骤:设置每个按钮的槽函数,当点击对应的按钮,就将对应按钮的颜色设置白色,其他按钮的颜色设置为 黑色

 


//我的文件按钮的槽函数
//当我们点击 ”我的文件“按钮时,其他按钮的也是这样
void buttongroup::on_myfile_btn_clicked()
{
   ui->user_btn->setStyleSheet("color:black");
   ui->share_btn->setStyleSheet("color:black");
   ui->myfile_btn->setStyleSheet("color:white");
   ui->tran_btn->setStyleSheet("color:black");
   ui->switch_btn->setStyleSheet("color:black");
   ui->user_btn->setStyleSheet("color:black");
   emit myfilePage();//发送一个信号,让stackwidget切换到我的文件的页面
}

3.6 切换页面功能实现

  • 由于buttongroupQStackWidgetMainWindow中的子窗口buttongroup不能直接切换QStackWidget中的界面
  • 当我们点击buttongroup中对应的按钮,buttongroup就会发出相应的信号MainWindow就会根据槽函数切换相应的页面。

 


//我的文件按钮
void buttongroup::on_myfile_btn_clicked()
{
   ui->user_btn->setStyleSheet("color:black");
   ui->share_btn->setStyleSheet("color:black");
   ui->myfile_btn->setStyleSheet("color:white");
   ui->tran_btn->setStyleSheet("color:black");
   ui->switch_btn->setStyleSheet("color:black");
   ui->user_btn->setStyleSheet("color:black");
   emit myfilePage();
}

.....其他按钮的槽函数


 //setCurrentWidget是显示对应的页面
void MainWindow::setSiganlButton()
{
    //切换到我的文件页面
    connect(ui->butgroup,&buttongroup::myfilePage,this,[=](){
       
        ui->stackedWidget->setCurrentWidget(ui->myfile_page);
        ui->myfile_page->showMyfile();
    });

    //切换到共享页面
    connect(ui->butgroup,&buttongroup::sharePage,this,[=](){
         ui->stackedWidget->setCurrentWidget(ui->share_page);
         ui->share_page->getFileCount();
    });


    //传输列表页面
    connect(ui->butgroup,&buttongroup::tranPage,this,[=](){
         ui->stackedWidget->setCurrentWidget(ui->tran_page);
    });

    //切换用户页面
    connect(ui->butgroup,&buttongroup::switchPage,this,[=](){
        //切换用户界面
         emit switchUser();
        //切换用户的所需要的操作
        ui->myfile_page->changerUser();
    });

}

 

 

4.我的文件页面的设计

自定义一个myfile类型,添加新文件myfile.h,myfile.cpp,myfile.ui文件:

myfile.ui文件:

ps: QListWidget存储的对象是QListWidgetItem 。 

 在mainwindow.ui文件中,选择stackedWidget 下的一个页面,将该页面提升为 myfile类型

4.1 菜单栏的设计

  1. 当鼠标右键点击 窗口的空白,则出现 空白的菜单栏
  2. 鼠标右键点击 窗口中的文件 时,则出现 文件的菜单栏

 

实现:

1.让listWidget窗口使用 setContextMenuPolicy(Qt::CustomContextMenu),设置右击鼠标发出的

customContextMenuRequested( const QPoint& pos) 信号,pos变量 时当前鼠标的位置

2.定义两个菜单栏

 //在myfile.h文件中定义两个菜单栏
 QMenu* m_fileMenu;
 QMenu* m_blankMenu;


//右键点击文件产生的菜单项
QAction* m_downloadAction;//下载
QAction* m_deleteAction;  //删除
QAction *m_shareAction;   //分享
QAction *m_propertyAction;//属性

//右键点击空白产生的菜单项
QAction *m_downloadAscAction;  //按下载量升序
QAction *m_downloadDescAction; //按下载量降序
QAction *m_refreshAction;      //更新
QAction *m_uploadAction;       //上传

//将菜单项设置进菜单栏中
void myfile::setMenuAction()
{
    m_downloadAction=new QAction("下载");
    m_deleteAction=new QAction("删除");
    m_shareAction=new QAction("分享");   //分享
    m_propertyAction=new QAction("属性");//属性


    m_fileMenu->addAction(m_downloadAction);
    m_fileMenu->addSeparator();
    m_fileMenu->addAction(m_deleteAction);
    m_fileMenu->addSeparator();
    m_fileMenu->addAction(m_shareAction);
    m_fileMenu->addSeparator();
    m_fileMenu->addAction(m_propertyAction);

    //右键点击空白产生的菜单
    m_downloadAscAction=new QAction("按下载量升序");  //按下载量升序
    m_downloadDescAction=new QAction("按下载量降序"); //按下载量降序
    m_refreshAction=new QAction("更新");      //更新
    m_uploadAction=new QAction("上传");       //上传


    m_blankMenu->addAction(m_downloadAscAction);
    m_blankMenu->addSeparator();
    m_blankMenu->addAction(m_downloadDescAction);
    m_blankMenu->addSeparator();
    m_blankMenu->addAction(m_refreshAction);
    m_blankMenu->addSeparator();
    m_blankMenu->addAction(m_uploadAction);
    
    //给菜单选项设置槽函数
    setActionConnect();
}
//myfile.cpp文件
//设置菜单栏
void myfile::setWidgetMemu()
{
    //创建自定义菜单栏
    m_fileMenu=new MyMenu(this); 
    m_blankMenu=new MyMenu(this);
    //设置右击鼠标的触发的事件
    ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->listWidget,&QWidget::customContextMenuRequested,this,[=](const QPoint& pos)
    {
        //itemAt获取pos位置上的QListWidgetItem 
        //如果pos位置上没有QListWidgetItem.则返回nullptr
        QListWidgetItem* item=ui->listWidget->itemAt(pos);
        if(item==nullptr){
            //鼠标在窗口的位置
            qDebug()<<"选中空位置";
            m_blankMenu->exec(QCursor::pos());//显示菜单栏
        }else{
            //鼠标选到对应的文件 
            //exec显示菜单栏,QCursor::pos()是获取相对于全局的位置点
            m_fileMenu->exec(QCursor::pos());
            qDebug()<<"选中文件";//显示菜单栏
        }
    });
}

4.2 自定义菜单栏

普通菜单栏: 

自定义菜单栏:

 

 1.自定义一个 菜单栏类 MyMenu,将这个菜单栏继承QMenu

#include <QObject>
#include<QMenu>
class MyMenu:public QMenu
{
public:
    MyMenu(QWidget* parent=nullptr);
};

2.MyMenu在构造函数中 使用 setStyleSheet 设置样式即可

3.样式可以在 样式表 中进行选择。

//MyMenu.cpp文件
MyMenu::MyMenu(QWidget* parent):QMenu (parent)
{
    setStyleSheet("background-color: rgb(101, 255, 245);
                    font: 9pt \"黑体\";color: rgb(255, 36, 8);");
}


4.3 设置菜单项中的槽函数


void myfile::setActionConnect()
{
    //右键文件菜单
    //点击下载文件
    connect(m_downloadAction,&QAction::triggered,this,[=]{
         dealfile(DealFile::Download);
    });

    //点击删除文件
    connect(m_deleteAction,&QAction::triggered,this,[=]{
         dealfile(DealFile::Delete);
    });

    //点击分享文件
    connect(m_shareAction,&QAction::triggered,this,[=]{
         dealfile(DealFile::Share);
    });

    //点击文件属性
    connect(m_propertyAction,&QAction::triggered,this,[=]{
        qDebug()<<"显示文件属性";
        dealfile(DealFile::Show);
    });


    //右键空白菜单
    connect(m_downloadAscAction,&QAction::triggered,this,[=]{
             // qDebug()<<"按下载量降序";
              getFileCount(Desc);
    });


    connect(m_downloadDescAction,&QAction::triggered,this,[=]{
            //  qDebug()<<"按下载量升序";
               getFileCount(Asc);
    });

    connect(m_refreshAction,&QAction::triggered,this,[=]{
            getFileCount(Normal);
            qDebug()<<"更新";
    });

    //上传文件
    connect(m_uploadAction,&QAction::triggered,this,[=]{
             addUploadFile();
             qDebug()<<"上传";
    });
}

 5.共享列表窗口的设计

共享列表窗口跟我的文件的设计 一模一样的,这里不做多说明。

6.传输列表窗口的设计

自定义一个transformwidget类型,添加新文件transformwidget.h,transformwidget.cpp:

传输列表ui结构:

上传列表:

 

 下载列表:

传输记录:

进入mainwindow.ui,将stackedWidget下对应的页面提升为transformwidget。

 7. 切换用户功能的实现

点击切换用户按钮,跳转到登录界面:

1.在设置切换用户按钮的槽函数,在槽函数中发送一个switchPage的信号。

//切换用户按钮
void buttongroup::on_switch_btn_clicked()
{
    emit switchPage();
}

//在Dialog设置switchPage的槽函数
 connect(mainwindow,&MainWindow::switchUser,this,[=](){
        mainwindow->hide();
        this->show();
 });

完整代码链接:

sjp1237/Cloud-disk at 7_28 (github.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【QT 网络云盘客户端】——主窗口界面的设计 的相关文章

随机推荐

  • 软连接的建立和删除

    想把A文件夹放在B文件夹下面 ln s A B 想取消软连接 rm rf B A 千万不要写成 rm rf B A 这样会删除A里面的数据
  • [2020.5.30]gdb常用总结

    前提 使用的是带debug信息的动态库 1 info 1 types 查看该类型符号是否存在 若存在显示该类型符号相关信息 info types SDL WindowData info types ucontext t 2 function
  • CSS中关于字体样式p标签的属性

    CSS中关于P标签中的样式 1 font family 浏览器在显示字体的时候 依次判断是否支持当前的字体 直到最后的字体系列 font family 宋体 仿宋 sans serif 浏览器若不支持宋体 则用仿宋 若不支持仿宋 则在san
  • Kafka3.0.0版本——消费者(消费者组详细消费流程图解及消费者重要参数)

    目录 一 消费者组详细消费流程图解 二 消费者的重要参数 一 消费者组详细消费流程图解 创建一个消费者网络连接客户端 主要用于与kafka集群进行交互 如下图所示 调用sendFetches发送消费请求 如下图所示 1 Fetch min
  • [C++]宏定义字节对齐#PragmaPack/Pop

    Pragma Pack n 指定对齐的字节数 pragma pop pop 恢复对齐状态 默认4字节对齐 目录 什么是对齐 对齐规则 功能 应用 什么是对齐 现代计算机中内存空间都是按照byte划分的 从理论上讲似乎对任何类型的变量的访问可
  • RFID智能仓储管理系统,更加智能化的仓储管理,你选择对了吗-新导智能

    不同的企业规模 产品类别 有着不同的仓储办理流程和需求 但核心的部分 都还在于进出库在内的库房作业和移库 盘库在内的库存操控作业 而跟着整个出产制作环境的改变 产品周期越来越短 多样少数的出产办法开始兴起 来自商场端的需求对仓储办理提出了更
  • MySQL 中的数据类型介绍

    据我统计 MySQL支持39种 按可使用的类型字段统计 即同义词也作多个 数据类型 下面的介绍可能在非常古老的mysql版本中不适用 转载请注明出处 http blog csdn net anxpp article details 5128
  • CSS样式--被忽略的前端基础(一)

    CSS样式 被忽略的前端基础 一 前言 以前学后端觉得前端不屑一顾 easy 后来从事前端开发后觉得其实并不简单 尤其是在css这一块 总觉得简单 没怎么系统的学习 现在觉得语言只是一种处理和解决问题工具 而你对基础掌握的深度影响着你解决问
  • H5选择本地文件夹下图片上传到服务器,并在网页中显示

    文章目录 基本 变种 html5 缺点 还要选择 基本
  • 面对“失业焦虑”我们可以做些什么?

    前言 在回答这个问题之前 我想先稍微聊一下我国当下的就业形势 当下的就业形势 近几年的就业形势非常严峻 除了疫情方面的影响 我认为更重要的是下行的经济环境带来的坏处 这二者相互叠加 给社会造就了如今这么复杂的就业现状 一 毕业生人数与就业岗
  • shell脚本中getopts的使用

    在shell中 getopts用于解析命令选项和参数 getopts是Bash shell的内置命令 不支持长选项 仅解析短选项 即一个破折号 和一个字母或数字 如 1 e E等 getopts格式如下 getopts OptString
  • 文件数据块分块算法解析

    文件数据块分块算法解析 1 简介 存储系统的重复数据删除过程一般是这样的 首先将数据文件分割成一组数据块 为每个数据块计算指纹 然后以指纹为关键字进行Hash查找 匹配则表示该数据块为重复数据块 仅存储数据块索引号 否则则表示该数据块是一个
  • CyclicLR pytorch实现

    论文 https arxiv org abs 1506 01186 论文中给了keras版本 1 如何寻找最大和最小学习率 参考https github com davidtvs pytorch lr finder 安装 python3 5
  • 9.1.3 定点数类型

    9 1 3 定点数类型 MySQL中的定点数类型只有DECIMAL一种类型 DECIMAL类型也可以使用 M D 进行表示 其中 M被称为精度 是数据的总位数 D被称为标度 表示数据的小数部分所占的位数 定点数在MySQL内部是以字符串的形
  • idea和eclipse修改背景颜色

    idea和eclipse修改背景颜色 idea修改背景颜色 file gt settings gt Editor gt Color Scheme gt 选择Darcula 应用即可 eclipse修改背景颜色 Window Preferen
  • k8s中Deployment模板

    apiVersion apps v1 kind Deployment metadata labels app app api name app api spec replicas 1 pod副本数 selector matchLabels
  • C++ 基础相关 备忘

    一 decltype 获取类型 typeid a name int i 0 decltype i j 0 cout lt lt typeid j name lt lt endl 二 编译选项 as needed g std c 11 o e
  • 电脑进不了桌面_XP系统进不了桌面,Explorer错误

    客户一台老电脑 XP系统进不了桌面 出现Explorer错误 故障原因 iexplore exe文件损坏或者系统中exe病毒 核心原因是垃圾软件进程注入explorer 3个解决方法 1 下载exe病毒专杀工具保存到u盘里面 U盘引导进PE
  • C++命名空间与头文件的关系

    C 命名空间与头文件的关系 一 添加一个头文件demonamespace h 内容如下 ifndef DEMONAMESPACE H define DEMONAMESPACE H class A public int value names
  • 【QT 网络云盘客户端】——主窗口界面的设计

    目录 1 设计主窗口界面 2 设置窗口的背景图片 3 自定义标题栏 3 1 设置toolbutton按钮的图片 3 2 设置按钮的大小 3 3 将自定义标题栏添加设置到主页面中 3 4 去除窗口的原标题栏 3 5 设置按钮颜色 3 6 切换