当前位置: 首页 > 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;助力新人快速实…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...