C/C++ Qt 标准Dialog对话框组件应用

本文详细介绍了Qt框架中常用的标准对话框,包括QMessageBox、QInputDialog和QFileDialog的使用方法。通过实例展示了如何创建提示信息、输入对话框、文件选择对话框,并提供了关闭事件处理和用户交互场景的示例。内容覆盖了消息提示、文本、整数、浮点数输入以及文件操作等常见功能。

在Qt中对话框分为两种形式,一种是标准对话框,另一种则是自定义对话框,在一般开发过程中标准对话框使用是最多的了,标准对话框一般包括 QMessageBox,QInputDialog,QFileDialog 这几种,这里我将总结本人在开发过程中常用到的标准对话框的使用技巧。

Qt框架下,常用的标准对话框有下面这几种:

  • QMessageBox 提示信息框
  • QInputDialog 基本输入对话框(文本输入,整数输入,浮点数输入,单选框输入)
  • QFileDialog 文件选择对话框(选择文件,多选文件,保存文件)

QMessageBox 消息弹窗: 消息对话框用于提示用户,常见的有四种分别是:提示,警告,错误,确认,代码归纳如下所示。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// By : LyShark
// 弹出各种MessageBox
void MainWindow::on_pushButton_clicked()
{
    QString dlgTitle="消息框";
    QString strInfo="文件已被修改,是否保存修改 ?";

    QMessageBox::StandardButton defaultBtn = QMessageBox::NoButton; // 缺省按钮
    QMessageBox::StandardButton result;                             // 返回选择的按钮

    // 弹窗分类 Question information warning critical
    result=QMessageBox::question(this, dlgTitle, strInfo,QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,defaultBtn);

    if (result==QMessageBox::Yes)
        ui->plainTextEdit->appendPlainText("Question消息框: Yes 被选择");
    else if(result==QMessageBox::No)
        ui->plainTextEdit->appendPlainText("Question消息框: No 被选择");
    else if(result==QMessageBox::Cancel)
        ui->plainTextEdit->appendPlainText("Question消息框: Cancel 被选择");
    else
        ui->plainTextEdit->appendPlainText("Question消息框: 无选择");
}

// 弹出关于提示
void MainWindow::on_pushButton_2_clicked()
{
    QString dlgTitle="about 消息框";
    QString strInfo="我开发的数据查看软件 V1.0 \n 保留所有版权";
    QMessageBox::about(this, dlgTitle, strInfo);
}

QMessageBox 退出事件: 弹窗组件还可以配合QCloseEvent实现事件通知机制,例如当窗体被关闭则提示用户是否关闭窗体。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMessageBox>
#include <QCloseEvent>

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

// 窗口关闭时询问是否退出
void MainWindow::closeEvent(QCloseEvent *event)
{
   QMessageBox::StandardButton result=QMessageBox::question(this, "确认", "确定要退出本程序吗?",
                      QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,
                      QMessageBox::No);

    if (result==QMessageBox::Yes)
        event->accept();
    else
        event->ignore();
}

// By : LyShark
MainWindow::~MainWindow()
{
    delete ui;
}

QInputDialog 对话框: 该对话框长用于输入一段特殊的文本,浮点数,或者选择一个列表框中的选项,该功能用于简单的用户交互场景。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QLineEdit>
#include <QInputDialog>

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 文本输入对话框
void MainWindow::on_pushButton_clicked()
{
    QString dlgTitle="输入文字对话框";
    QString txtLabel="请输入文件名";
    QString defaultInput="新建文件.txt";
    QLineEdit::EchoMode echoMode=QLineEdit::Normal;       // 正常文字输入
    // QLineEdit::EchoMode echoMode=QLineEdit::Password;  // 密码输入

    bool flag = false;
    QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode,defaultInput, &flag);
    if (flag && !text.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(text);
    }
}

// 整数数值输入对话框
// By : LyShark
void MainWindow::on_pushButton_2_clicked()
{
    QString dlgTitle="输入整数对话框";
    QString txtLabel="设置字体大小";
    int defaultValue=ui->plainTextEdit->font().pointSize();   // 现有字体大小
    int minValue=6, maxValue=50, stepValue=1;                 // 范围(步长)
    bool flag=false;
    int inputValue = QInputDialog::getInt(this, dlgTitle,txtLabel,defaultValue, minValue,maxValue,stepValue,&flag);
    if (flag)
    {
        QFont font=ui->plainTextEdit->font();
        font.setPointSize(inputValue);
        ui->plainTextEdit->setFont(font);
    }
}

// 浮点数输入对话框
void MainWindow::on_pushButton_3_clicked()
{
    QString dlgTitle="输入浮点数对话框";
    QString txtLabel="输入一个浮点数";
    float defaultValue=3.13;

    float minValue=0, maxValue=10000;  // 范围
    int decimals=2;                    // 小数点位数

    bool flag=false;
    float inputValue = QInputDialog::getDouble(this, dlgTitle,txtLabel,defaultValue, minValue,maxValue,decimals,&flag);
    if (flag)
    {
        QString str=QString::asprintf("输入了一个浮点数:%.2f",inputValue);
        ui->plainTextEdit->appendPlainText(str);
    }
}

// 单选框条目选择对话框
void MainWindow::on_pushButton_4_clicked()
{
    QStringList items;                        // 列表内容
    items <<"优秀"<<"良好"<<"合格"<<"不合格";    // 放入列表

    QString dlgTitle="条目选择对话框";
    QString txtLabel="请选择级别";
    int curIndex=0; //初始选择项
    bool editable=false;                       // 是否可编辑
    bool flag=false;
    QString text = QInputDialog::getItem(this, dlgTitle,txtLabel,items,curIndex,editable,&flag);

    if (flag && !text.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(text);
    }
}

QFileDialog 对话框: 该对话框用于对文本的操作,例如打开文件,保存文件,选择文件夹等,当点击选择后,对话框会自动提取出文件路径。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 选择单个文件对话框
void MainWindow::on_pushButton_clicked()
{
    QString curPath=QDir::currentPath();                                       // 获取系统当前目录
//  QString  curPath=QCoreApplication::applicationDirPath();                   // 获取应用程序的路径
    QString dlgTitle="选择一个文件";                                             // 对话框标题
    QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)";  // 文件过滤器

    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);

    if (!aFileName.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(aFileName);
    }
}

// 选择多个文件对话框
// By : LyShark
void MainWindow::on_pushButton_2_clicked()
{
    // QString curPath=QCoreApplication::applicationDirPath();                // 获取应用程序的路径
    QString curPath=QDir::currentPath();                                      // 获取系统当前目录
    QString dlgTitle="选择多个文件";                                            // 对话框标题
    QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; // 文件过滤器

    QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
    for (int i=0; i<fileList.count();i++)
    {
        // 循环将文件路径添加到列表中
        ui->plainTextEdit->appendPlainText(fileList.at(i));
    }
}

// 选择文件夹
void MainWindow::on_pushButton_3_clicked()
{
    QString curPath=QCoreApplication::applicationDirPath();    // 获取应用程序的路径
    // QString curPath=QDir::currentPath();                    // 获取系统当前目录

    // 调用打开文件对话框打开一个文件
    QString dlgTitle="选择一个目录";                             // 对话框标题
    QString selectedDir=QFileDialog::getExistingDirectory(this,dlgTitle,curPath,QFileDialog::ShowDirsOnly);
    if (!selectedDir.isEmpty())
    {
        ui->plainTextEdit->appendPlainText(selectedDir);
    }
}

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

<think>我们使用C++Qt来实现一个文件对话框,用于选择.txt后缀的文件。主要使用QFileDialog::getOpenFileName函数,并设置文件过滤器为"文本文件 (*.txt)"。 步骤: 1. 包含必要的头文件:<QApplication>, <QMainWindow>, <QPushButton>, <QFileDialog>等。 2. 创建一个主窗口类,继承自QMainWindow。 3. 在主窗口中添加一个按钮,点击按钮时触发文件选择对话框。 4. 在按钮的槽函数中,调用QFileDialog::getOpenFileName,并设置过滤器。 5. 处理选择的文件路径。 注意:在C++中,我们使用双引号来定义字符串,并且注意过滤器的格式:使用两个分号(;;)来分隔不同的过滤器。 代码示例:</think># Qt 文件对话框:选择 .txt 后缀文件(C++实现) 在 Qt 中实现弹出文件选择对话框并过滤 `.txt` 后缀文件,可以使用 `QFileDialog` 类。以下是一个完整的 C++ 实现示例: ```cpp #include <QApplication> #include <QMainWindow> #include <QPushButton> #include <QFileDialog> #include <QLabel> #include <QVBoxLayout> #include <QWidget> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建主窗口组件 QWidget *centralWidget = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout(centralWidget); // 创建按钮 QPushButton *openButton = new QPushButton("选择文本文件", this); connect(openButton, &QPushButton::clicked, this, &MainWindow::openTxtFile); // 创建标签用于显示结果 filePathLabel = new QLabel("未选择文件", this); filePathLabel->setWordWrap(true); fileContentLabel = new QLabel("", this); fileContentLabel->setWordWrap(true); // 添加组件到布局 layout->addWidget(openButton); layout->addWidget(new QLabel("选择的文件路径:", this)); layout->addWidget(filePathLabel); layout->addWidget(new QLabel("文件内容:", this)); layout->addWidget(fileContentLabel); // 设置主窗口 centralWidget->setLayout(layout); setCentralWidget(centralWidget); setWindowTitle("Qt 文件对话框示例"); resize(500, 300); } private slots: void openTxtFile() { // 弹出文件选择对话框并设置.txt过滤器 QString filePath = QFileDialog::getOpenFileName( this, // 父窗口 "选择文本文件", // 对话框标题 "", // 起始目录(空表示当前目录) "文本文件 (*.txt);;所有文件 (*)" // 文件过滤器 ); if (!filePath.isEmpty()) { // 用户选择了文件(非取消操作) filePathLabel->setText(filePath); // 读取并显示文件内容 QFile file(filePath); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); QString content = in.readAll(); fileContentLabel->setText(content); file.close(); } else { fileContentLabel->setText("无法打开文件"); } } else { filePathLabel->setText("未选择文件"); fileContentLabel->setText(""); } } private: QLabel *filePathLabel; QLabel *fileContentLabel; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } #include "main.moc" // 对于包含Q_OBJECT的类需要包含moc文件 ``` ## 关键代码解析 ### 1. 文件对话框设置 ```cpp QString filePath = QFileDialog::getOpenFileName( this, // 父窗口 "选择文本文件", // 对话框标题 "", // 起始目录(空表示当前目录) "文本文件 (*.txt);;所有文件 (*)" // 文件过滤器 ); ``` - **文件过滤器**:`"文本文件 (*.txt);;所有文件 (*)"` 表示只显示 `.txt` 文件,同时提供显示所有文件的选项 - `;;` 分隔不同过滤器选项 - 如果用户点击"取消",返回的 `filePath` 为空字符串 ### 2. 文件内容读取 ```cpp QFile file(filePath); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); QString content = in.readAll(); // 处理文件内容... file.close(); } ``` ## 文件过滤器的进阶用法 ### 同时过滤多种文本格式 ```cpp "文本文件 (*.txt);;日志文件 (*.log);;所有文件 (*)" ``` ### 设置默认目录 ```cpp QFileDialog::getOpenFileName(..., "/home/documents", ...); ``` ### 选择多个文件 ```cpp QStringList files = QFileDialog::getOpenFileNames(...); ``` ## 注意事项 1. 在 Windows/macOS/Linux 上会自动适配系统原生文件对话框 2. 过滤器语法格式:`"描述 (*.后缀1 *.后缀2);;..."`[^1] 3. 对于包含 `Q_OBJECT` 宏的类,需要包含对应的 moc 文件(如 `#include "main.moc"`) ## 文件对话框的替代方案 如果需要更复杂的文件选择界面,可以创建自定义的 `QFileDialog` 实例: ```cpp QFileDialog dialog(this); dialog.setFileMode(QFileDialog::ExistingFile); dialog.setNameFilter("文本文件 (*.txt)"); dialog.setViewMode(QFileDialog::Detail); if (dialog.exec()) { QStringList files = dialog.selectedFiles(); // 处理选择的文件 } ``` 这种方法允许更精细地控制文件对话框的行为[^1]。 [^1]: Qt 文件对话框 API 参考 [^2]: 文件过滤器语法格式说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微软技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值