Qt自定义文件选择框

news2025/1/16 11:28:02

文章目录

  • 前言
  • 一、头文件
  • 二、源文件
  • 三、qss文件
  • 四、效果


前言

在开发过程中,经常遇到使用文件选择框的情况,qt默认的文件选择框,样式可能与开发的桌面程序差异比较大.此时,我们可以自定义文件选择框,设置其样式,尽量做到样式统一.

一、头文件

#ifndef CUSTOMFILEDIALOG_H
#define CUSTOMFILEDIALOG_H

#include <QDialog>
#include <QFileDialog>
#include <QHBoxLayout>
#include <QMouseEvent>

#include "mymessagedialog.h"

namespace Ui {
class CustomFileDialog;
}

class CustomFileDialog : public QDialog
{
    Q_OBJECT

public:
    explicit CustomFileDialog(QWidget *parent = nullptr);
    ~CustomFileDialog();

    void createFileDialog(QString);
    QStringList selectedFiles() const;

signals:
    void selectFileSignal(QString);

private slots:
    void on_minBtn_clicked();

    void on_closeBtn_clicked();
    void onFileDialogFinished(int);

private:
    void init();
    void loadUI();

private:
    Ui::CustomFileDialog    *ui;
    QFileDialog             *m_fileDialog = nullptr;
    QHBoxLayout             *hLayout;
    QPoint                  last = QPoint(0,0);
    QStringList             m_fileList;
    MyMessageDialog     *m_nonRulesMsgDialog = nullptr;

protected:
    void mousePressEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
};

#endif // CUSTOMFILEDIALOG_H

二、源文件

#include "customfiledialog.h"
#include "ui_customfiledialog.h"

#include <QComboBox>
#include <QLineEdit>
#include <QDialogButtonBox>
#include <QDebug>

CustomFileDialog::CustomFileDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CustomFileDialog)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint);
    this->setWindowTitle("文件对话框");
    this->setWindowIcon(QIcon(":/logo.ico"));

    init();
}

CustomFileDialog::~CustomFileDialog()
{
    if(m_nonRulesMsgDialog){
        delete m_nonRulesMsgDialog;
        m_nonRulesMsgDialog = nullptr;
    }
    delete ui;
}

void CustomFileDialog::init()
{
    ui->label->setText("文件选择框");
    ui->minBtn->hide();
    //
    loadUI();
}

void CustomFileDialog::createFileDialog(QString defaultDir){
    if(m_fileDialog == nullptr)
        m_fileDialog = new QFileDialog(ui->bodyWidget,"选择文件啊",defaultDir);
    m_fileDialog->setWindowFlags(Qt::FramelessWindowHint);
    m_fileDialog->setFileMode(QFileDialog::FileMode::ExistingFile);
    m_fileDialog->setOption(QFileDialog::DontUseNativeDialog, true);
    m_fileDialog->setAcceptMode(QFileDialog::AcceptSave);
    m_fileDialog->setLabelText(QFileDialog::Accept, tr("选择"));
    m_fileDialog->setViewMode(QFileDialog::Detail);
    m_fileDialog->setNameFilter("W3060_*_V*.alx");
    //
    hLayout  = new QHBoxLayout;
    hLayout->addWidget(m_fileDialog);
    hLayout->setSpacing(0);
    hLayout->setMargin(0);
    ui->bodyWidget->setLayout(hLayout);
    //
    QLabel* lookinLabel = m_fileDialog->findChild<QLabel*>("lookInLabel");
    if (lookinLabel)
        lookinLabel->setText("文件目录:");
    QComboBox* fileTypeCombo = m_fileDialog->findChild<QComboBox*>("fileTypeCombo");
    if (fileTypeCombo)
        fileTypeCombo->setMinimumHeight(40);
    QComboBox* lookInCombo = m_fileDialog->findChild<QComboBox*>("lookInCombo");
    if (lookInCombo)
        lookInCombo->setMinimumHeight(40);
    QLineEdit* fileNameEdit = m_fileDialog->findChild<QLineEdit*>("fileNameEdit");
    if (fileNameEdit)
    {
        fileNameEdit->setReadOnly(true);
        fileNameEdit->setMinimumHeight(40);
    }
    m_fileDialog->setLabelText(QFileDialog::FileName,"文件目录");
    m_fileDialog->setLabelText(QFileDialog::FileType,"文件类型");
    QDialogButtonBox *buttonBox = m_fileDialog->findChild<QDialogButtonBox *>("buttonBox");
    /*if (QPushButton *button = buttonBox->button(QDialogButtonBox::Open))
    {
            button->setStyleSheet("QPushButton{background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #00BAFF, stop: 1 #00A1FF);font-size: 12px;color: #FFFFFF;border-radius:2px;}"
                                  "QPushButton:hover{background: #00C1FF;font-size: 12px;color: #FFFFFF;border-radius:2px;}"
                                  "QPushButton:disabled{background: #F0F0F0;border: 1px solid #DDDDDD;font-size: 12px;color: #BBBBBB;border-radius:2px;}");
            button->setFixedSize(68, 30);
    }*/
    if (QPushButton *button = buttonBox->button(QDialogButtonBox::Save))
    {
        button->setStyleSheet("QPushButton{background-color: rgb(1,141,235);font-size: 20px;color: #FFFFFF;border-radius:2px;}"
                              "QPushButton:hover{background: rgb(1,141,235);font-size: 20px;color: #FFFFFF;border-radius:2px;}"
                              "QPushButton:disabled{background: #F0F0F0;border: 1px solid #DDDDDD;font-size: 20px;color: #BBBBBB;border-radius:2px;}");
        button->setFixedSize(68, 40);
    }
    if (QPushButton *button = buttonBox->button(QDialogButtonBox::Cancel))
    {
        button->setStyleSheet("QPushButton{border: 1px solid #DDDDDD;font-size: 20px;color: #666666;border-radius:2px;}"
                              "QPushButton:hover{font-size: 20px;color: #00A1FF;border: 1px solid #00A1FF;border-radius:2px;}"
                              "QPushButton:disabled{background: #F0F0F0;border: 1px solid #DDDDDD;font-size: 20px;color: #BBBBBB;border-radius:2px;}");
        button->setText("取消");
        button->setFixedSize(68, 40);
    }
    connect(m_fileDialog, SIGNAL(finished(int)), this, SLOT(onFileDialogFinished(int)));
}

QStringList CustomFileDialog::selectedFiles() const
{
    return m_fileList;
}

void CustomFileDialog::onFileDialogFinished(int result)
{
    if (result == QDialog::Accepted)
    {
        //qDebug()<<"CustomFileDialog::onFileDialogFinished Accepted";
        m_fileList.clear();
        m_fileList = m_fileDialog->selectedFiles();
        QRegularExpression regex("^W3060_.*_V\\d+\\.\\d+\\.\\d+\\.alx$");

        for(const QString &selectedFile : m_fileList)
        {
            QString text = selectedFile.section('/',-1);
            //qDebug()<<"text ="<<text;
            QRegularExpressionMatch match = regex.match(text);
            if(match.hasMatch()){
                //qDebug()<<"选中的文件符合规则";
                emit selectFileSignal(m_fileList.first());
            }
            else{
                //qDebug()<<"选中的文件不符合规则";
                if(m_nonRulesMsgDialog == nullptr){
                    m_nonRulesMsgDialog = new MyMessageDialog;
                    m_nonRulesMsgDialog->setCancleBtn(false);
                }
                m_nonRulesMsgDialog->setInfo("安装包不符合命名规则");
                m_nonRulesMsgDialog->setModal(true);
                m_nonRulesMsgDialog->show();
            }
        }
        //
        delete m_fileDialog;
        m_fileDialog = nullptr;
        delete  hLayout;

        QDialog::accept();
    }
    else
    {
        //qDebug()<<"CustomFileDialog::onFileDialogFinished reject";
        delete m_fileDialog;
        m_fileDialog = nullptr;
        delete  hLayout;

        QDialog::reject();
    }
}

void CustomFileDialog::loadUI()
{
    QString fileName = QString(":/image/customFileDialog.qss");
    QFile file(fileName);
    if(file.open(QIODevice::ReadOnly))
    {
        QString str = QString::fromUtf8(file.readAll());
        this->setStyleSheet(str);
        file.close();
    }
}

void CustomFileDialog::on_minBtn_clicked()
{
    this->showMinimized();
}

void CustomFileDialog::on_closeBtn_clicked()
{
    delete m_fileDialog;
    m_fileDialog = nullptr;
    delete  hLayout;
    this->close();
}

void CustomFileDialog::mousePressEvent(QMouseEvent *event)
{
    if(event->y() < ui->titleWidget->height())
    {
        last = event->globalPos();
    }
}

void CustomFileDialog::mouseMoveEvent(QMouseEvent *event)
{
    if(event->y() < ui->titleWidget->height())
    {
        int dx = event->globalX() - last.x();
        int dy = event->globalY() - last.y();
        last = event->globalPos();
        this->move(this->x() + dx,this->y() + dy);
    }
}

void CustomFileDialog::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->y() < ui->titleWidget->height())
    {
        int dx = event->globalX() - last.x();
        int dy = event->globalY() - last.y();
        this->move(this->x() + dx,this->y() + dy);
    }
}

三、qss文件

#titleWidget{
        background-color:rgb(1,141,235)/*#4E69E1*/;
}

#label{
	color:white;
	font:24px;
}
#closeBtn{
        border-image:url(:/image/sysclose.png);
	width:40px;
	height:40px;
}


#minBtn{
   border-image: url(:/image/sysmin.png);
	width:40px;
	height:40px;
}

#minBtn:hover{
   border-image: url(:/image/sysmin_hover.png);
}

#minBtn:pressed{
   border-image: url(:/image/sysmin_hover.png);
}


QLabel{
	font-size:20px;
	color:#666666;
}

QComboBox::down-arrow{
        image: url(:/image/drop-down.png);
	padding-right:4px;
}

QComboBox::down-arrow:on{
        image: url(:/image/drop-up.png);
	padding-right:4px;
}

QComboBox::drop-down{
	background-color:rgb(255,255,255);
}

QComboBox::drop-down:disabled,QComboBox:disabled{
	background-color:#f8f8f8
}

QLineEdit,QComboBox{
	color: #666666;
	border: 1px solid #DDDDDD;
	border-radius:2px;
}

QListView, QTreeView{
	outline: 0px;
	background-color:white;
	border: 1px solid #DDDDDD;
	color:#666666;
	selection-color:#666666;
	selection-background-color: #f6f6f6;
	border-radius:2px;
}

QListView::item, QTreeView::item{
	height:30px;
	text-align:center;
}

QListView::item:selected,QTreeView::item:selected{
	/*border: 1px solid #6a6ea9;*/
	background-color: #1e90ff;
	color : rgb(255, 255, 255);
}

QScrollBar:horizontal{
     background: #ffffff;
     height: 20px;
	border-width:0px 10px 0px 10px;
	margin-left:6px;
	margin-right:20px;
	padding-left:14px;
}

QScrollBar::handle:horizontal{
     background:rgb(1,141,235)/*#1c86ee*/;
     border-radius:3px;
     height: 20px;
     max-width:40px;
}

QSplitter::handle {
     background-color: rgb(255, 255, 255);
}

QScrollBar::sub-line:horizontal{
     /*background:transparent;*/
	width:20px;
	height:20px;
	subcontrol-position:left;
	subcontrol-origin:margin;
}

QScrollBar::add-line:horizontal{
     /*background:transparent;*/
	width:20px;
	height:20px;
	subcontrol-position:right;
	subcontrol-origin:margin;
}

QScrollBar:vertical {
     background: #ffffff;
     width: 20px;
	border-width:10px 0px 10px 0px;
	margin-top:7px;
	margin-bottom:0px;
	padding-top:17px;
	padding-bottom:24px;
}

QScrollBar::handle:vertical {
     background:rgb(1,141,235)/*#1c86ee*/;
     border-radius:3px;
     width: 20px;
}

QScrollBar::sub-line:vertical {
	width:20px;
	height:24px;
	subcontrol-position:top left;
	subcontrol-origin:margin;
}

QScrollBar::add-line:vertical {
	width:20px;
	height:24px;
	subcontrol-position:bottom;
	subcontrol-origin:border;
}

QHeaderView::section {    
    color: #333333;  
    height:18px;
    font-size:12px;  
    background-color: #f8f8f8;  
    border:1px solid #eeeeee;  
    border-left:none;
    border-top:none;  
    padding:6px 10px 1px 10px;
}  

/*QHeaderView::down-arrow {
    image: url(~/image/drop-down.png);
}

QHeaderView::up-arrow {
    image: url(~/image/drop-up.png);
} */

QMenu{
	background-color:white;
	border-style:none;
}

QMenu::item {
	font-size: 12px;
	color: #666666;
	background-color:#ffffff;
	padding:8px;
}

QMenu::item:selected {
	background-color:#f6f6f6;
	color:#666666;
}

QMenu::item:!enabled {
	background-color:white;
	color:#999999;
}

QMenu::item:hover {
	color:#666666;
}

QMenu::separator {
    height: 1px;
    background: #eeeeee;
    margin: 2px 5px 2px 10px;
}

四、效果

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1154326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】顺序表的学习

前言:在之前我们学习了C语言的各种各样的语法&#xff0c;因此我们今天开始学习数据结构这一个模块&#xff0c;因此我们就从第一个部分来开始学习"顺序表"。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:C程序设计谭浩强版本…

环信 IM+AI编程挑战赛开启报名!

大赛背景 即时通讯已成为现代生活中不可或缺的一部分&#xff0c;近年来人工智能的迅猛发展也为即时通讯带来了前所未有的智能化体验。高度拟人的陪伴型机器人&#xff0c;全能实用的服务型机器人&#xff0c;高效智能的对话机器人&#xff0c;AI 与即时通讯的结合创新&#x…

ARM版CentOS Linux系统镜像安装教程

Linux系统受程序员钟爱&#xff0c;目前国内常见版本有Ubuntu和CentOS等&#xff0c;CentOS是较为稳定的Linux系统。如何在苹果电脑上安装Linux系统呢&#xff0c;小编为大家准备了ARM版CentOS Linux系统镜像文件资源&#xff0c;一起来看看吧&#xff01; ARM版CentOS Linux系…

Jenkins自动化部署简单配置

下载安装jenkins 安装Jenkins步骤 点击Next的时候会有jdk版本跟Jenkins版本不符合的情况 1. 看下任务管理器内Jenkins服务是否启动&#xff0c;在浏览器里面输入localhost:2023&#xff08;端口号是安装时输入的&#xff09; 2. 根据路径找到放置密码的文件&#xff08;C…

[SpringCloud] Feign 与 Gateway 简介

目录 一、Feign 简介 1、RestTemplate 远程调用中存在的问题 2、定义和使用 Feign 客户端 3、Feign 自定义配置 4、Feign 性能优化 5、Feign 最佳实践 6、Feign 使用问题汇总 二、Gateway 网关简介 1、搭建网关服务 2、路由断言工厂 3、路由的过滤器配置 4、全局过…

SpringCloud(五) Eureka与Nacos的区别

SpringCloud(二) Eureka注册中心的使用-CSDN博客 SpringCloud(四) Nacos注册中心-CSDN博客 在这两篇博文中我们详细讲解了Eureka和Nacos分别作为微服务的注册中心的使用方法和注意事项,但是两者之间也有一些区别. 一, Nacos实例分类 Nacos实例分为两种类型: 临时实例:如果实例…

C# Onnx P2PNet 人群检测和计数

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…

msvcp140.dll丢失怎么修复?msvcp140.dll文件缺失的解决方法

msvcp140.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable for Visual Studio 2015的一部分。这个文件包含了C运行时库的一些函数和资源&#xff0c;许多应用程序和游戏都需要依赖这个文件来正常运行。当电脑中缺少msvcp140.dll文件或者该文件损坏…

【JQuery-XSS漏洞(CVE-2020-11022/CVE-2020-11023)漏洞复现】

文章目录 一、漏洞描述二、受影响版本三、漏洞复现四、漏洞危害五、修复建议 一、漏洞描述 进行在公司内部用nessus做漏洞扫描时&#xff0c;发现某台服务器报出这个中危漏洞&#xff0c;后面查资料复现。 根据脚本中的自我报告版本&#xff0c;远程web服务器上托管的JQuery版…

新建包含cuda和cudnn的docker

背景&#xff1a;服务器的cudnn版本太低了&#xff0c;没有权限去修改。故新建包含cuda和cudnn的docker 步骤 一、拉取镜像及创建docker 拉取相关的镜像 从镜像列表选出相关版本的镜像https://gitlab.com/nvidia/container-images/cuda/blob/master/doc/supported-tags.md …

vue实现学生成绩管理案例

实现了学生成绩的管理&#xff0c;可以增加科目成绩&#xff0c;不及格的成绩自动标红&#xff0c;删除成绩&#xff0c;实现总分统计、平均分计算。 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" />&…

Java:视频按帧进行截图

主要介绍了Java获取视频时长、总帧数&#xff0c;并按照时间或者帧进行截图&#xff0c;希望对大家的学习有所帮助&#xff01; 1、Maven依赖 <!--start:视频获取某一帧的图片--> <dependency><groupId>org.bytedeco</groupId><artifactId>java…

前后端分离项目(六):数据分页查询(前端视图)

&#x1f680; 优质资源分享 &#x1f680; &#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一个全栈订餐系统。 &#x1f49b;Python量化交易实战&#x1f49…

无糖茶饮三十年,从无人问津到人手一瓶

【潮汐商业评论/原创】 Joan又在外卖上点了一堆瓶装茶饮&#xff0c;东方树叶、燃茶、三得利乌龙茶……买了四五种纯茶&#xff0c;用她的话说&#xff0c;和美式咖啡相比&#xff0c;这些无糖茶更适合他这个中国体质。 事实上&#xff0c;越来越多的消费者开始像Joan一样&am…

食堂管理,这个操作不要太绝哦!

随着科技的不断进步&#xff0c;餐饮行业也在积极寻求创新的方式来提高效率、提供更好的客户体验以及降低运营成本。智慧收银系统为餐饮业提供了一个全新的方式来管理交易、优化库存和了解客户需求。 智慧收银系统使食堂经营者能够实现更高的自动化、更大的精确度和更好的数据分…

第58篇-某看准招聘参数分析-AES加密【2023-10-31】

声明&#xff1a;该专栏涉及的所有案例均为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请私信联系本人删帖&#xff01; 文章目录 一、前言二、网站分析1.参数kiv2.参数b3.响应加密 一、前…

React 组件prop传值

将 props 传递给子组件 开发环境&#xff1a;Reacttsant 将一些 props 传递给 Avatar。例如&#xff0c;让我们传递两个 props&#xff1a;person&#xff08;一个对象&#xff09;和 size&#xff08;一个数字&#xff09; 定义类组件Avatar&#xff08;子组件&#xff09;和…

【k8s】pod详解

一、pod介绍 1、pod的基础概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象&#xff0c;一个pod代表着集群中运行的一个进程。kubernetes中其它大多数组件都是围绕着pod来进行支持和扩展pod功能的。 例如&#xff0c;用于管理po…

科技战再次升级!国内前沿科技行业影响悬而未决

&#xff08;图片来源&#xff1a;网络&#xff09; 美国与中国的科技贸易战正在升级&#xff0c;美国总统拜登发布行政命令限制美国对半导体和微电子、量子信息技术和人工智能等特定行业的跨国投资。在此前美国对中国芯片相关出口的一系列限制之后&#xff0c;又增加了此项新…

遥遥领先,免费开源的django4-vue3项目

星域后台管理系统前端介绍 &#x1f33f;项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发&#xff0c;融合了typescript和element-plus-ui&#xff0c;提供暗黑模式和白昼模式两种主题以及全屏切换&#xff0c;开发bug少&#xff0c;简单易学&#xff0c…