当前位置: 首页 > news >正文

Qt自定义文件选择框

文章目录

  • 前言
  • 一、头文件
  • 二、源文件
  • 三、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_OBJECTpublic: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;
}

四、效果

请添加图片描述

相关文章:

Qt自定义文件选择框

文章目录 前言一、头文件二、源文件三、qss文件四、效果 前言 在开发过程中,经常遇到使用文件选择框的情况,qt默认的文件选择框,样式可能与开发的桌面程序差异比较大.此时,我们可以自定义文件选择框,设置其样式,尽量做到样式统一. 一、头文件 #ifndef CUSTOMFILEDIALOG_H #d…...

金蝶云星空创建自动下推并保存公共服务

文章目录 金蝶云星空创建自动下推并保存公共服务创建公共方法按单下推数据按明细行下推数据调用下推操作 调用公共方法 金蝶云星空创建自动下推并保存公共服务 创建公共方法 按单下推数据 /// <summary>/// 获取单据转换数据包/// </summary>public DynamicObjec…...

人大金仓助力中国人民银行征信中心业务系统异地容灾优化升级

日前&#xff0c;人大金仓助力中国人民银行应收账款融资服务平台异地容灾项目顺利上线&#xff0c;保证了平台系统运行的连续性和数据安全&#xff0c;为充分发挥平台的融资功能&#xff0c;缓解中小微企业融资难提供了强有力的保障。 缓解中小微企业融资难 中国人民银行构于2…...

[架构之路-249/创业之路-80]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 产品(数据)管理

目录 前言&#xff1a; 一、企业信息化的结果&#xff1a;常见企业信息化软件 1.1 产品数据管理 1.1.1 什么是产品数据管理What 1.1.1.1 常见工具 1.1.1.2 软件企业的产品数据管理系统 1.1.2 为什么需要产品数据管理系统Why&#xff1f; 1.1.3 谁需要产品数据管理系统w…...

【NI-DAQmx入门】传感器基础知识

1.什么是传感器&#xff1f; 传感器可将真实的现象&#xff08;例如温度或压力&#xff09;转换为可测量的电流和电压&#xff0c;因而对于数据采集应用必不可少。接下来我们将介绍您所需的测量类型及其对应的传感器类型。在开始之前&#xff0c;您还可以先了解一些传感器术语&…...

CMake:构建时为特定目标运行自定义命令

CMake&#xff1a;构建时为特定目标运行自定义命令 导言项目结构相关源码结果 导言 add_custom_command 是 CMake 中用于添加自定义构建规则的命令&#xff0c;通常用于在编译项目时执行一些自定义操作&#xff0c;例如生成文件、运行脚本等。 项目结构 . ├── CMakeLists…...

基于适应度相关算法的无人机航迹规划-附代码

基于适应度相关算法的无人机航迹规划 文章目录 基于适应度相关算法的无人机航迹规划1.适应度相关搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用适应度相关算法来优化无人机航迹…...

jmeter BeanShell预处理程序:报错Error invoking bsh method: eval...

1、jmeter运行报错&#xff1a; ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval In file: inline evaluation of: " . . . Encountered "" at line 13, column 23. WARN o.a.j.m.BeanShellPreProcessor: Problem in BeanShell scri…...

使用springboot对Elasticsearch 进行索引的增、删、改、查

一 SpringBoot Elasticsearch 项目环境搭建 1.1 修改pom文件添加依赖 目前使用spring-boot-starter-parent版本为2.2.8.RELEASE 对应spring-data-elasticsearch版本为2.2.8.RELEASE&#xff0c;版本对应可以自行百度&#xff0c;如果不行直接用elasticsearch-rest-high-lev…...

Project#2: Extendible Hash Index

文章目录 准备Task #1-Read/Write Page GuardsBasicPageGuard/ReadPageGuard/WritePageGuardUpgradeWrappersTests Task #2-Extendible Hash Table PagesHash Table Header Pages**成员变量&#xff1a;****方法实现&#xff1a;** Hash Table Directory Pages**成员变量&#…...

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试

背景&#xff1a;Web 端需要使用已有的 C 库&#xff08;使用 CMake 编译&#xff09;&#xff0c;需要将 C 项目编译成 WebAssembly(.wasm) 供 js 调用。 上篇文章《Mac 上安装 Emscripten》 已讲解如何安装配置 Emscripten 环境。 本篇文章主要讲解如何将基于 CMakeLists 配…...

MATLAB中preparets函数用法

目录 语法 说明 示例 准备开环和闭环网络的数据 preparets函数的功能是为网络模拟或训练准备输入和目标时间序列数据 语法 [Xs,Xi,Ai,Ts,EWs,shift] preparets(net,Xnf,Tnf,Tf,EW) 说明 [Xs, Xi, Ai, Ts, EWs, shift] preparets(net, Xnf, Tnf, Tf, EW) 这个函数接受…...

ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南续篇

作者&#xff1a;运维有术 前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ks-master-1172.16.33.1661650200KubeSp…...

react官网

应急方案 – React 中文文档 (docschina.org) 正版卡死版 Hooks FAQ – React (reactjs.org) 英文流畅版 应急方案 – React 中文网 (nodejs.cn) 盗版流畅版&#xff08;翻译有稍稍的问题&#xff09; http://www.react-cn.com/index.html 黄版...

前端css介绍

CSS介绍 CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;它就会按照这个样式表来对文档进行格式化&#xff08;渲染&#xff09;。 CSS语法 CSS实例 每个CSS样式由两个组成部分&#xff1a;选择器和…...

MySql创建索引

在MySQL中&#xff0c;可以使用CREATE INDEX语句来创建索引。以下是创建索引的基本语法&#xff1a; CREATE INDEX index_name ON table_name (column1, column2, ...);其中&#xff0c;index_name是索引的名称&#xff0c;可以自定义&#xff08;也可以不指定索引名称&#x…...

前后端分离vue+springboot家庭理财账单财务管理系统

项目介绍&#xff1a; 该系统能够管理家庭收入支出&#xff0c;并且能直观得表现收支状态。主要功能包括用户管理、收支管理、财务管理、统计收支情况等功能。 技术栈&#xff1a; 后端&#xff1a; SpringBoot&#xff0c;Sa-Token&#xff0c;MyBatis-Plus&#xff0c;MyB…...

LeetCode:2003. 每棵子树内缺失的最小基因值(C++)

目录 2003. 每棵子树内缺失的最小基因值 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 启发式合并 原理思路&#xff1a; 2003. 每棵子树内缺失的最小基因值 题目描述&#xff1a; 有一棵根节点为 0 的 家族树 &#xff0c;总共包含 n 个节点&#xff0c;节点编…...

React Hooks之useContext使用

官方文档写道&#xff1a;在组件的顶层调用 useContext 来读取和订阅 context。 我理解就是一个“全局变量”的概念。它可以用来声明一个变量&#xff0c;然后在各个组件中使用&#xff0c;避免了props一级一级往下传&#xff0c;当然使用场景有限&#xff0c;比如设置一个主题…...

多模态对比语言图像预训练CLIP:打破语言与视觉的界限

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...