《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

news2025/2/25 17:40:54

QFileDialog 对话框

选择打开一个文件

若要打开一个文件,可调用静态函数 QFileDialog::getOpenFileName(),“打开一个文件”按钮的响应代码如下: 

void Dialog::on_btnOpen_clicked()
{ //选择单个文件
     QString curPath=QDir::currentPath();//获取系统当前目录
    //获取应用程序的路径
    QString dlgTitle="选择一个文件"; //对话框标题
     QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器
    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    if (!aFileName.isEmpty())
        ui->plainTextEdit->appendPlainText(aFileName);
}

QFileDialog::getOpenFileName() 函数需要传递 3 个字符串型参数,分别如下:

  1.     对话框标题,这里设置为"选择一个文件"。
  2.     初始化目录,打开对话框时的初始目录,这里用QDinxurrentPath()获取应用程序当前目录。
  3.     文件过滤器,设置选择不同后缀的文件,可以设置多组文件,如:
QString f ilter="文本文件.txt);;图片文件(* .jpg *.gif *.png);;所有文件(*.*)";

 每组文件之间用两个分号隔开,同一组内不同后缀之间用空格隔开。
QFileDialog::getOpenFileName() 函数返回的是选择文件的带路径的完整文件名,如果在对话框里取消选择,则返回字符串为空。

选择打开多个文件

若要选择打开多个文件,可使用静态函数 QFileDialog::getOpenFileNames(),“打开多个文件”按钮的响应代码如下:

 1 void Dialog::on_btnOpenMulti_clicked()
 2 { //选择多个文件
 3     //获取应用程序的路径
 4     QString curPath=QDir::currentPath();//获取系统当前目录
 5     QString dlgTitle="选择多个文件"; //对话框标题
 6     QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器
 7     QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
 8     for (int i=0; i<fileList.count();i++)
 9         ui->plainTextEdit->appendPlainText(fileList.at(i));
10 }

getOpenFileNames() 函数的传递参数与 getOpenFileName() —样,只是返回值是一个字符串列表,列表的每一行是选择的一个文件。

选择已有目录

选择己有目录可调用静态函数 QFileDialog::getExistingDirectory(),同样,若需要传递对话框标题和初始路径,还应传递一个选项,一般用 QFileDialog::ShowDirsOnly,表示对话框中只显示目录。

静态函数 QCoreApplication::applicationDirPath() 返回应用程序可执行文件所在的目录,getExistingDirectory() 函数的返回值是选择的目录名称字符串。

 选择保存文件名

选择一个保存文件,使用静态函数 QFileDialog::getSaveFileName(),传递的参数与 getOpenFileName() 函数相同。只是在调用 getSaveFileName() 函数时,若选择的是一个己经存在的文件,会提示是否覆盖原有的文件。如果提示覆盖,会返回为选择的文件,但是并不会对文件进行实质操作,对文件的删除操作需要在选择文件之后自己编码实现。

如下面的代码,即使选择覆盖文件,由于代码里没有实质地覆盖原来的文件,也不会对选择的文件造成任何影响:

1 void Dialog::on_btnSave_clicked()
2 {//保存文件
3     QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
4     QString dlgTitle="保存文件"; //对话框标题
5     QString filter="文本文件(*.txt);;h文件(*.h);;C++文件(.cpp);;所有文件(*.*)"; //文件过滤器
6     QString aFileName=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
7     if (!aFileName.isEmpty())
8         ui->plainTextEdit->appendPlainText(aFileName);
9 }

 写一个栗子:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<qpushbutton.h>
#include<QLabel>
#include<QLineEdit>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QFileDialog>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    QLabel *FileNameLabel;
    QLineEdit *FileNameLineEdit;

    QPushButton *FileBtn;
    QLabel *FileSizeLabel;
    QLineEdit *FileSizeLineEdit;

    QPushButton *GetFileInfoBtn;

private slots:
    void GetFileInfo();//用于打开问你件
    void GetFileSizeInfo();//用于获取文件大小
};
#endif // DIALOG_H
#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("FileDialog文件对话框测试");
    //创建控件
    FileNameLabel=new QLabel("文件名称: ");
    FileNameLineEdit=new QLineEdit;
    FileBtn=new QPushButton("选择...");

    FileSizeLabel=new QLabel("文件大小:");
    FileSizeLineEdit=new QLineEdit;

    GetFileInfoBtn=new QPushButton("获取文件大小信息");


    //排列布局
    QGridLayout *glayout=new QGridLayout;
    glayout->addWidget(FileNameLabel,0,0);
    glayout->addWidget(FileNameLineEdit,0,1);
    glayout->addWidget(FileBtn,0,2);

    glayout->addWidget(FileSizeLabel,1,0);
    glayout->addWidget(FileSizeLineEdit,1,1,1,2);

    QHBoxLayout *hlayout=new QHBoxLayout;
    hlayout->addWidget(GetFileInfoBtn);

    QVBoxLayout *vlayout=new QVBoxLayout(this);
    vlayout->addLayout(glayout);
    vlayout->addLayout(hlayout);

    //连接信号
    connect(FileBtn,SIGNAL(clicked()),this,SLOT(GetFileInfo()));
    connect(GetFileInfoBtn,SIGNAL(clicked()),this,SLOT(GetFileSizeInfo()));
}

Dialog::~Dialog()
{
}

void Dialog::GetFileInfo()
{
    QString strFileName=QFileDialog::getOpenFileName(this,"打开","/","File(*)");
    FileNameLineEdit->setText(strFileName);

}

void Dialog::GetFileSizeInfo()
{
    //获取单行编辑框控件里面文件路径等
    QString strFileSize=FileNameLineEdit->text();

    QFileInfo fileinfo(strFileSize);
    qint64 FileSize=fileinfo.size();

    FileSizeLineEdit->setText(QString::number(FileSize));
}

这是一个基于Qt框架的对话框程序,主要实现了获取指定文件的路径和大小,并将其显示在对应的单行编辑框控件中。具体实现方式如下:

  1. GetFileInfo()函数:该函数通过调用QFileDialog::getOpenFileName()方法弹出一个打开文件对话框,让用户选择要打开的文件。选择完成后,将文件名显示在一个单行编辑框控件中。

  2. GetFileSizeInfo()函数:该函数获取单行编辑框控件中的文件路径,使用QFileInfo类获取该文件的大小,并将大小显示在另一个单行编辑框控件中。

这两个函数都是Dialog类的成员函数,其中this指针代表当前对话框对象。可以通过这些函数方便地实现文件信息的获取和显示。

运行结果:

QMessageBox 消息对话框

简单信息提示

消息对话框 QMessageBox 用于显示提示、警告、错误等信息,或进行确认选择,由几个静态函数实现这些功能(详见表 1)。其中 warning()、information()、critical() 和 about() 这几个函数的输入参数和使用方法相同,只是信息提示的图标有区别。

StandardButton QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)

其中,parent 是对话框的父窗口,指定父窗口之后,打开对话框时,对话框将自动显示在父窗口的上方中间位置;title 是对话框标题字符串;text 是对话框需要显7K的信息字符串;buttons 是对话框提供的按钮,缺省只有一个 OK 按钮;defaultButton 是缺省选择的按钮,缺省表示没有选择。

 

warning() 函数的返回结果是 StandardButton 类型。对话框上显示的按钮和缺省选中按钮也是 StandardButton 类型。

StandardButton 是各种按钮的定义,如 OK、Yes、No、Cancel 等,其枚举取值是 QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Close 等。

详见 Qt 帮助文档中的StandardButton 类型的说明。

对于 warning()、information()、critical() 和 about() 这几种对话框,它们一般只有一个 OK 按钮,且无须关心对话框的返回值。所以,使用缺省的按钮设置即可。

确认选择对话框 

QMessageBox::question() 函数用于打开一个选择对话框,提示信息,并提供 Yes、No、OK、Cancel 等按钮,用户单击某个按钮返回选择,如常见的文件保存确认对话框如图所示。 

静态函数 QMessageBox::question() 的原型如下: 

StandardButton QMessageBox::question(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)

 question() 对话框的关键是在其中可以选择显示多个按钮,例如同时显示 Yes、No、OK 或 Cancel() 其返回结果也是一个 StandardButton 类型变量,表示哪个按钮被单击了。

举个栗子: 

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<qpushbutton.h>
#include<QLabel>
#include<QGridLayout>
#include<QMessageBox>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    QLabel *displabel;
    QPushButton *questionbtn;//问题消息命令按钮
    QPushButton *infomationbtn;//信息消息命令按钮
    QPushButton *warningbtn;//警告消息命令按钮
    QPushButton *criticalbtn;//错误消息命令按钮
    QPushButton *aboutbtn;//消息框命令按钮
    QPushButton *aboutqtbtn;//命令按钮

    QGridLayout *glayout;//布局

private slots:
    void DisplayQuestionMsg();
    void DisplayInfomationMsg();
    void DisplayWarningMsg();
    void DisplayCriticalMsg();
    void DisplayAboutMsg();
    void DisplayAboutQtMsg();


};
#endif // DIALOG_H

 

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    resize(320,150);
    setWindowTitle("QMessqge对话框控件测试");
    glayout=new QGridLayout(this);
    displabel=new QLabel("请选择:");

    questionbtn=new QPushButton("Qusestion");
    infomationbtn=new QPushButton("Infomation");
    warningbtn=new QPushButton("Warning");
    criticalbtn=new QPushButton("critical");
    aboutbtn=new QPushButton("About");
    aboutqtbtn=new QPushButton("ABoutQt");

    glayout->addWidget(displabel,0,0,1,2);
    glayout->addWidget(questionbtn,1,0);
    glayout->addWidget(infomationbtn,1,1);
    glayout->addWidget(warningbtn,2,0);
    glayout->addWidget(criticalbtn,2,1);
    glayout->addWidget(aboutbtn,3,0);
    glayout->addWidget(aboutqtbtn,3,1);

    connect(questionbtn,SIGNAL(clicked()),this,SLOT(DisplayQuestionMsg()));
    connect(infomationbtn,SIGNAL(clicked()),this,SLOT(DisplayInfomationMsg()));
    connect(warningbtn,SIGNAL(clicked()),this,SLOT(DisplayWarningMsg()));
    connect(criticalbtn,SIGNAL(clicked()),this,SLOT(DisplayCriticalMsg()));
    connect(aboutbtn,SIGNAL(clicked()),this,SLOT(DisplayAboutMsg()));
    connect(aboutqtbtn,SIGNAL(clicked()),this,SLOT(DisplayAboutQtMsg()));
}

Dialog::~Dialog()
{
}

void Dialog::DisplayQuestionMsg()
{
    displabel->setText("Question Message Box");
    switch (QMessageBox::question(this,"Question消息框","是否退出程序?",
            QMessageBox::Ok|QMessageBox::Cancel,QMessageBox::Ok)) {
        case QMessageBox::Ok:
            displabel->setText("你选择QuestionMsg命令按钮中的Ok");
            break;
        case QMessageBox::Cancel:
            displabel->setText("你选择QuestionMsg命令按钮中的Cancel");
            break;
        default:
            break;
    }
    return;
}

void Dialog::DisplayInfomationMsg()
{
    displabel->setText("Infomation Message Box");
    QMessageBox::information(this,"Information消息框","Information消息框测试成功");

    return;
}

void Dialog::DisplayWarningMsg()
{
    displabel->setText("Warning Message Box");

    switch (QMessageBox::question(this,"Question消息框","数据库student是否删除",
            QMessageBox::Discard|QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Save)) {
        case QMessageBox::Discard:
            displabel->setText("你选择WarningMsg命令按钮中的Discard");
            break;
        case QMessageBox::Save:
            displabel->setText("你选择WarningMsg命令按钮中的Save");
            break;
        case QMessageBox::Cancel:
            displabel->setText("你选择WarningMsg命令按钮中的Cancel");
        default:
            break;
    }
}

void Dialog::DisplayCriticalMsg()
{
    displabel->setText("Critical Message Box");
    QMessageBox::critical(this,"critical消息框","数据库文件备份错误");
    return;
}

void Dialog::DisplayAboutMsg()
{
    displabel->setText("About Message Box");
    QMessageBox::about(this,"about消息框","测试Qt about消息框");
    return;
}

void Dialog::DisplayAboutQtMsg()
{
    displabel->setText("About Qt  Message Box");
    QMessageBox::aboutQt(this,"about qt消息框-0--");
    return;
}

这一大段代码,头文件中主要是定义一些我们需要用到的量,包括按钮和输入栏 以及一些槽函数。

在源文件中,我们先进行了实例化操作和布局上的安排,紧接着就开始链接槽函数。

DisplayQuestionMsg()函数,用于:你点击按钮之后询问是否退出程序,出现ok和cancel按钮。
DisplayInfomationMsg()函数,用于消息框测试,判断你是否点击了。
DisplayWarningMsg()函数用于发出警告,目前的 功能类似第一个。
DisplayCriticalMsg()函数用于测试critical按钮,类似第二个。
DisplayAboutMsg()同2.
DisplayAboutQtMsg()函数用于打开关于qt功能。
结果:

感谢阅读!!!!!!

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

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

相关文章

安卓通信方式简介

目录 一、Binder二、Socket三、Binder与Socket四、Handler 一、Binder Binder作为Android系统提供的一种IPC机制&#xff0c;无论从系统开发还是应用开发&#xff0c;都是Android系统中最重要的组成。 二、Socket Socket通信方式也是C/S架构&#xff0c;比Binder简单很多。在…

Veeam - 数据保护和管理解决方案_Windows平台部署备份还原VMware手册

Veeam - - 数据保护和管理解决方案 Veeam Backup & Replication Console Veeam Data Platform Veeam Backup & Replication是一款强大的虚拟机备份、恢复和复制解决方案 安全备份、干净恢复和数据弹性 — 即时交付 在混合云中随时随地管理、控制、备份和恢复您的所有数…

debian testing (预计13版本)wps字体无法正常显示

背 景 本人使用debian办公&#xff0c;原来使用的是debian 12,由于“生命不息&#xff0c;折腾不止“&#xff0c;终于将稳定版的debian 12升级为testing. 结果发现&#xff0c;debian 12能够正常使用的wps存在部分字体无法正常显示&#xff0c;经研究发现&#xff0c;原来是w…

论文《Deep graph tensor learning for temporal link prediction》阅读

论文《Deep graph tensor learning for temporal link prediction》阅读 论文概况IntroductionRelated work动态图表示学习图张量表示 Preliminary张量生成建模 深度图张量学习模型A.基于图紧凑的空间表示B.时间模式表示C.时空特征聚合D.损失函数 实验消融实验 总结 论文概况 …

【C++】学习笔记——string_5

文章目录 六、string类7. string类的模拟实现8. string类的模拟实现的完整代码string.h头文件test.c源文件 9. string收尾写时拷贝 未完待续 六、string类 7. string类的模拟实现 我们之前讲了实现 insert &#xff0c;但是那个插入函数仅仅是在 pos 位置插入一个字符而且&am…

提取网页元数据的Python库之lassie使用详解

概要 Lassie是一个用于提取网页元数据的Python库,它能够智能地抓取网页的标题、描述、关键图像等内容。Lassie的设计目的是为了简化从各种类型的网页中提取关键信息的过程,适用于需要预览链接内容的应用场景。 安装 安装Lassie非常简单,可以通过Python的包管理器pip进行安…

多目标跟踪入门介绍

多目标跟踪算法 我们也可以称之为 Multi-Target-Tracking &#xff08;MTT&#xff09;。 那么多目标跟踪是什么&#xff1f; 不难看出&#xff0c;跟踪算法同时会为每个目标分配一个特定的 id 。 由此得出了目标跟踪与目标检测的区别&#xff08;似乎都是用方框来框出目标捏…

PLC设备通过智能网关采用HTTP协议JSON文件对接MES等系统平台

智能网关IGT-DSER集成了多种PLC的原厂协议&#xff0c;方便实现各种PLC、智能仪表通过HTTP协议与MES等各种系统平台通讯对接。PLC内不用编写程序&#xff0c;设备不用停机&#xff0c;通过网关的参数配置软件(下载地址)配置JSON文件的字段与PLC寄存器地址等参数即可。 智能网关…

小程序如何确定会员身份并批量设置会员积分或余额

因为一些原因&#xff0c;商家需要从其它系统里面批量导入会员&#xff0c;确定会员身份&#xff0c;然后给他们设置对应的账户余额。下面&#xff0c;就具体介绍如何进行这种操作。 一、客户进入小程序并绑定手机号 进入小程序&#xff1a;客户打开小程序&#xff0c;系统会自…

利用AI提高内容生产效率的五个方案

目录 如何利用AI提高内容生产效率? ​编辑方向一&#xff1a;自动化内容生成 方向二&#xff1a;内容分发与推广 方向三&#xff1a;内容分析与优化 方向四&#xff1a;图像和音频处理 方向五&#xff1a;自动编辑和校对 如何利用AI提高内容生产效率? 简介&#xff1a…

system函数和popen函数

system函数 #include <stdlib.h> *int system(const char command); system函数在linux中的源代码&#xff1a; int system(const char * cmdstring) {pid_t pid;int status;if(cmdstring NULL){return (1);}if((pid fork())<0){status -1;}else if(pid 0){ //子…

【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM

问题现象 问题的风险及影响 导致数据库无法托管监控 问题影响的版本 问题发生原因 安装数据库时修改了OM的监听ip为127.0.0.1 解决方法及规避方式 后台修改OM的ip为本机的ip或者0.0.0.0 问题分析和处理过程 1、修改env文件中的om IP地址&#xff0c;修改为0.0.0.0或本机…

G2 - 人脸图像生成(DCGAN)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识DCGAN原理 模型结构逻辑结构物理结构 模型实现前期准备1. 导入第三方库2. 修改随机种子(相同的随机种子&#xff0c;第i次随机的结果是固定的)3.…

Transformers中加载预训练模型的过程剖析

使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…

Java入门——类和对象(上)

经读者反映与笔者考虑&#xff0c;近期以及往后内容更新将主要以java为主&#xff0c;望读者周知、见谅。 类与对象是什么&#xff1f; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对…

回溯算法—组合问题

文章目录 介绍应用问题基本流程算法模版例题&#xff08;1&#xff09;组合&#xff08;2&#xff09;电话号码的字母组合 介绍 回溯算法实际上是 一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;…

明火检测实时识别报警:视觉算法助力安全生产管理

背景与现状 在各种工作、生产环境下&#xff0c;明火的存在往往是潜在的安全隐患。无论是加油站、化工园区、仓储场所还是校园&#xff0c;明火一旦失控就会引发火灾&#xff0c;造成严重的人员伤亡和财产损失。传统的明火检查手段主要依赖于人工巡查和定期的消防检查&#xf…

可微分矢量图形光栅化用于编辑和学习

图1. 我们引入了一种通过反向传播将光栅和矢量域联系起来的矢量图形可微分光栅化器。可微分光栅化实现了许多新颖的矢量图形应用。&#xff08;a&#xff09;在几何约束下&#xff0c;通过局部优化图像空间度量&#xff08;如不透明度&#xff09;来实现交互式编辑。&#xff0…

leetcode刷题:对称二叉树

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xf…

基于Springboot+Vue的Java项目-毕业就业信息管理系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…