QT文件操作与对话框交互详解,万字解析!!

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

#include <QFile>
#include<QFileDialog>

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(oncurrentIndexChanged(int)));
//    connect(this, SIGNAL(mysignal()), this, SLOT(myslot()));
//    connect(this, SIGNAL(mysignalparams(int)), this, SLOT(myslotparams(int)));
//    emit mysignal();
//    emit mysignalparams(100);
}

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

//void Widget::myslot()
//{
//    std::cout << "myslot" << std::endl;
//}

//void Widget::myslotparams(int value)
//{
//    qDebug() << "myslotparams";
//    qDebug() << value;
//}


void Widget::on_btnRead_clicked()
{
//    QFile file("E:/QT2/test.txt");
      QFile file;
      file.setFileName("E:/QT/test.txt");
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug() << "file open error";
    }
    int size = file.size();
    char* context = new char(size);
    char* con = (char *)malloc(sizeof(char)*size);
//    char context[100] = {"\0"};
    if(file.read(context, 100) == -1) return;
    qDebug() << context;
    file.close();
}


void Widget::on_btnWrite_clicked()
{
    QFile file("E:/QT/test2.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    file.write("Program 45-QFile001 write something to This File 我是测试");
}


void Widget::on_btnstreamRead_clicked()
{
    QFile file;
    file.setFileName("E:/QT/test.txt");
  if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
      qDebug() << "file open error";
  }

    QTextStream in(&file);
    in.setCodec("UTF-8");
    //QString context = in.read(file.size());
    while(!in.atEnd()){
    QString context = in.readLine();
    qDebug() << context;
    qDebug() << "---------";
    }

    file.close();
}


void Widget::on_btnstreamWrite_clicked()
{
    QFile file;
    file.setFileName("E:/QT/test3.txt");
  if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
      qDebug() << "file open error";
  }
    QTextStream out(&file);
    out.setCodec("UTF-8");
    out << "I write stream char to file ";
    file.close();
}


void Widget::on_btnQFileDialog_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "E:/QT/",
        tr(" Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)"));
    qDebug() << fileName;

    QFile file;
    file.setFileName(fileName);
  if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
      qDebug() << "file open error";
  }

    QTextStream in(&file);
    in.setCodec("UTF-8");
    //QString context = in.read(file.size());
    while(!in.atEnd()){
    QString context = in.readLine();
    qDebug() << context;
    qDebug() << "---------";
    }

    file.close();
}


void Widget::on_btnSe_clicked()
{
//    int arr[120];
//    for (int i : arr) {

//    }

    QFileDialog qFileDialog;
    qFileDialog.setFileMode(QFileDialog::ExistingFiles);
    qFileDialog.setNameFilter("*.txt");
    qFileDialog.exec();
    QStringList qstrings = qFileDialog.selectedFiles();
    for(QString str : qstrings){
            qDebug() << str;
    }
}


void Widget::on_btnSave_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
                               "E:/QT/untitled.txt",
                               tr("Text (*.txt *.doc)"));
    qDebug() << fileName;
    QFile file;
    file.setFileName(fileName);
  if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
      qDebug() << "file open error";
  }
    QTextStream out(&file);
    out.setCodec("UTF-8");
    out << "Qdialog Write Data to the Txt File";
    file.close();
}

void Widget::oncurrentIndexChanged(int index)
{
    qDebug() << index;
    qDebug() << ui->comboBox->currentText();
}
//解释这串代码,写上注释

这段代码是 widget.cpp 文件的实现部分,它包含了与文件操作、对话框交互以及下拉列表(QComboBox)相关的槽函数。下面我将为你逐行添加详细的中文注释,并解释每个函数的作用和逻辑。


📄 逐行解析 + 中文注释

包含头文件

复制代码

cpp

深色版本

复制代码
#include "widget.h"        // 包含自定义窗口部件类的声明
#include "ui_widget.h"      // 自动生成的 UI 类定义(包含界面控件)
#include <QFile>            // 提供文件读写功能
#include <QFileDialog>      // 提供文件选择对话框功能
  • widget.h :包含类 Widget 的声明;
  • ui_widget.h :由 Qt Designer 根据 .ui 文件生成,包含了所有界面元素的定义;
  • QFileQFileDialog:用于文件操作和打开文件对话框。

构造函数

复制代码

cpp

深色版本

复制代码
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);  // 初始化界面控件
    connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(oncurrentIndexChanged(int)));
    // 自动连接 comboBox 的 currentIndexChanged 信号到 oncurrentIndexChanged 槽
}
  • ui->setupUi(this) :初始化从 .ui 文件生成的所有控件;
  • connect() :手动连接 comboBox 控件的 currentIndexChanged(int) 信号到槽函数 oncurrentIndexChanged(int),虽然 Qt 自动连接机制也能处理这种情况,但这里显式地做了连接;

析构函数

复制代码

cpp

深色版本

复制代码
Widget::~Widget()
{
    delete ui;  // 清理分配给 ui 的资源
}
  • 释放 ui 对象,避免内存泄漏。

按钮点击事件处理函数

1. on_btnRead_clicked() ------ 使用字节方式读取文件内容
复制代码

cpp

深色版本

复制代码
void Widget::on_btnRead_clicked()
{
    QFile file;
    file.setFileName("E:/QT/test.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "file open error";
        return;
    }

    int size = file.size();
    char* context = new char(size);  // ❗错误!应为 new char[size]
    char* con = (char *)malloc(sizeof(char)*size);  // 未使用

    if(file.read(context, 100) == -1) {  // 读取最多100个字节
        qDebug() << "read error";
        return;
    }

    qDebug() << context;

    file.close();

    delete[] context;  // ❗注意:new[] 要用 delete[]
    free(con);
}
  • 这段代码尝试读取一个文本文件并输出其内容,但存在一些问题:
    • new char(size) 应该是 new char[size]
    • 未使用的变量 con
    • 更好的做法是使用 QByteArrayQString 来避免手动管理内存。
2. on_btnWrite_clicked() ------ 写入文本文件
复制代码

cpp

深色版本

复制代码
void Widget::on_btnWrite_clicked()
{
    QFile file("E:/QT/test2.txt");

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "file open error";
        return;
    }

    file.write("Program 45-QFile001 write something to This File 我是测试");
    file.close();
}
  • 如果文件不存在则创建新文件;
  • 如果已存在,则清空文件后再写入指定内容。
3. on_btnstreamRead_clicked() ------ 使用 QTextStream 流方式读取文件
复制代码

cpp

深色版本

复制代码
void Widget::on_btnstreamRead_clicked()
{
    QFile file;
    file.setFileName("E:/QT/test.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "file open error";
        return;
    }

    QTextStream in(&file);
    in.setCodec("UTF-8");

    while(!in.atEnd()) {
        QString context = in.readLine();
        qDebug() << context;
        qDebug() << "---------";
    }

    file.close();
}
  • 使用 QTextStream 逐行读取文件内容,适合读取文本文件;
  • 设置编码格式支持多语言字符。
4. on_btnstreamWrite_clicked() ------ 使用 QTextStream 流方式写入文件
复制代码

cpp

深色版本

复制代码
void Widget::on_btnstreamWrite_clicked()
{
    QFile file;
    file.setFileName("E:/QT/test3.txt");

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "file open error";
        return;
    }

    QTextStream out(&file);
    out.setCodec("UTF-8");

    out << "I write stream char to file ";
    file.close();
}
  • 使用 << 运算符像 std::cout 一样输出内容;
  • 支持多语言字符。
5. on_btnQFileDialog_clicked() ------ 弹出文件打开对话框并读取文件内容
复制代码

cpp

深色版本

复制代码
void Widget::on_btnQFileDialog_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(
        this,
        tr("Open Image"),
        "E:/QT/",
        tr("Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)")
    );

    qDebug() << fileName;

    QFile file;
    file.setFileName(fileName);

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "file open error";
        return;
    }

    QTextStream in(&file);
    in.setCodec("UTF-8");

    while(!in.atEnd()) {
        QString context = in.readLine();
        qDebug() << context;
        qDebug() << "---------";
    }

    file.close();
}
  • 允许用户选择任意文本文件进行读取;
  • 支持多种文件类型过滤;
  • 读取后输出到调试控制台。
6. on_btnSe_clicked() ------ 多文件选择对话框
复制代码

cpp

深色版本

复制代码
void Widget::on_btnSe_clicked()
{
    QFileDialog qFileDialog;
    qFileDialog.setFileMode(QFileDialog::ExistingFiles);
    qFileDialog.setNameFilter("*.txt");
    qFileDialog.exec();

    QStringList selectedFiles = qFileDialog.selectedFiles();

    for(QString str : selectedFiles){
        qDebug() << str;
    }
}
  • 弹出多选文件对话框;
  • 限制只能选择 .txt 文件;
  • 输出所有选中的文件路径。
7. on_btnSave_clicked() ------ 弹出保存文件对话框并写入内容
复制代码

cpp

深色版本

复制代码
void Widget::on_btnSave_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(
        this,
        tr("Save File"),
        "E:/QT/untitled.txt",
        tr("Text (*.txt *.doc)")
    );

    qDebug() << fileName;

    QFile file;
    file.setFileName(fileName);

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "file open error";
        return;
    }

    QTextStream out(&file);
    out.setCodec("UTF-8");

    out << "Qdialog Write Data to the Txt File";
    file.close();
}
  • 用户可输入文件名并选择保存路径;
  • 自动创建新文件;
  • 写入指定内容。

下拉列表变化响应函数

复制代码

cpp

深色版本

复制代码
void Widget::oncurrentIndexChanged(int index)
{
    qDebug() << index;
    qDebug() << ui->comboBox->currentText();
}
  • comboBox 的选项改变时触发;
  • 输出当前索引和对应的文本内容。

✅ 总结

这段代码主要实现了以下功能:

  • 文件读取和写入:通过按钮点击事件处理不同的文件操作;
  • 文件对话框:提供用户选择或保存文件的功能;
  • 下拉列表变化监听 :当 comboBox 的选项改变时,打印当前索引和文本内容。

如果你希望进一步优化代码或解决特定问题,请告诉我具体的需求或遇到的问题 😊

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include<iostream>
#include <QWidget>
#include<QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

//signals:
//        void mysignal();
//        void mysignalparams(int value);
//private slots:
//        void myslot();
//        void myslotparams(int value);


private slots:
    void on_btnRead_clicked();

    void on_btnWrite_clicked();

    void on_btnstreamRead_clicked();

    void on_btnstreamWrite_clicked();

    void on_btnQFileDialog_clicked();

    void on_btnSe_clicked();

    void on_btnSave_clicked();

    void oncurrentIndexChanged(int index);
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

你提供的这段代码是 widget.h 文件,它是 Qt 项目中主窗口类的头文件。这个类继承自 QWidget,并声明了多个私有槽函数(private slots),用于响应界面上各种控件(如按钮、下拉框等)的点击或状态变化事件。


📄 逐行解析 + 中文注释

头文件卫士(防止重复包含)

复制代码
#ifndef WIDGET_H
#define WIDGET_H
  • 如果 WIDGET_H 没有被定义,则继续编译;
  • 防止同一个头文件被多次包含,避免重复定义错误。

引入标准库和 Qt 类

复制代码
#include <iostream>     // C++ 标准输入输出流(虽然目前没用上)
#include <QWidget>      // Qt 的基础窗口部件类
#include <QDebug>       // Qt 调试输出工具,用于 qDebug() 打印调试信息

命名空间声明(由 .ui 自动生成)

复制代码
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
  • 这是对 .ui 文件生成的 UI 类的前置声明;
  • 实际上,在构建项目时,Qt 会根据 .ui 文件自动生成一个 ui_widget.h 文件;
  • 此处只是告诉编译器:"这个类存在",不需要知道具体实现。

类定义:Widget 继承 QWidget

复制代码
class Widget : public QWidget
{
    Q_OBJECT
  • 定义了一个名为 Widget 的类,继承自 QWidget
  • Q_OBJECT 是 Qt 的宏,表示这个类支持:
    • 信号与槽机制(Signal-Slot)
    • 元对象系统(Meta Object)
    • 动态属性、国际化等特性

构造函数和析构函数

复制代码
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
  • 构造函数:初始化窗口组件,默认无父窗口;
  • 析构函数 :释放资源,比如 ui 指针;

自定义信号(当前被注释掉了)

复制代码
//signals:
//        void mysignal();
//        void mysignalparams(int value);
  • 信号用于通知其他对象某些事件发生;
  • 比如可以当某个按钮被点击时发射信号;
  • 这里被注释掉,暂时没有使用。

自定义槽函数(也被注释掉了)

复制代码
//private slots:
//        void myslot();
//        void myslotparams(int value);
  • 槽函数用于接收信号并做出响应;
  • 同样被注释掉,未启用。

控件相关的槽函数(实际使用的)

复制代码
private slots:
    void on_btnRead_clicked();            // 读取文件按钮点击
    void on_btnWrite_clicked();           // 写入文件按钮点击
    void on_btnstreamRead_clicked();      // 流方式读取文件按钮点击
    void on_btnstreamWrite_clicked();     // 流方式写入文件按钮点击
    void on_btnQFileDialog_clicked();     // 打开文件对话框按钮点击
    void on_btnSe_clicked();              // 多选文件按钮点击
    void on_btnSave_clicked();            // 保存文件按钮点击
    void oncurrentIndexChanged(int index); // 下拉框选择改变时触发
  • 这些都是按钮或其他控件触发的槽函数;
  • 函数命名格式为 on_<控件名>_<信号名>(),这是 Qt 的自动连接机制要求的命名方式;
  • 当你在 .ui 文件中设置了对应控件的 objectName 名称后,Qt 会自动将这些函数与控件的信号连接起来。

私有成员变量:UI 界面指针

复制代码
private:
    Ui::Widget *ui;
  • ui 是指向由 .ui 文件生成的界面类的指针;
  • 通过 ui->xxx 可以访问界面上的控件(如按钮、文本框等);
  • 在构造函数中会调用 ui->setupUi(this); 来初始化界面。

结束头文件卫士

复制代码
#endif // WIDGET_H
  • 与最开始的 #ifndef WIDGET_H 配套使用,结束头文件保护。

✅ 总结结构图

部分 内容
头文件卫士 #ifndef / #define / #endif
引入头文件 <QWidget><QDebug>
UI 前置声明 namespace Ui { class Widget; }
类定义 class Widget : public QWidget
支持 Qt 特性 Q_OBJECT
构造/析构函数 初始化窗口、释放资源
注释掉的信号与槽 mysignal()myslot()
控件相关槽函数 7 个按钮和下拉框的响应函数
UI 成员指针 Ui::Widget *ui;,用于操作界面控件

💡 小贴士

  • 如果你在 .ui 文件中添加了新的按钮,并想让它触发某个函数,请确保:
    • 控件名(objectName)正确;
    • 函数名格式匹配 on_<objectName>_<signalName>()
    • .h 中声明为 private slots:
    • .cpp 中实现该函数逻辑。

如果你希望我帮你:

  • 补全对应的 .cpp 文件;
  • 添加新的功能;
  • 优化代码结构;
  • 或者美化界面布局;

都可以继续提问 😊

cpp 复制代码
#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

这段代码是 Qt 桌面应用程序的入口文件 main.cpp,它是程序运行的起点。下面我为你逐行加上详细的中文注释,并解释其作用和原理。


📄 代码 + 中文注释

复制代码
#include "widget.h"
  • 引入自定义窗口类 Widget 的头文件;

  • 这个类是你在 .ui 文件中设计的主窗口界面所对应的 C++ 类;

  • 包含了控件声明、槽函数等信息。

    #include <QApplication>

  • 引入 Qt 提供的应用程序管理类 QApplication

  • 每个基于 Qt 的 GUI 应用都必须有一个 QApplication 对象;

  • 它负责初始化图形系统、处理事件循环、接收命令行参数等。

复制代码
复制代码
int main(int argc, char *argv[])
{
  • 程序的主函数入口;

  • argc:命令行参数数量;

  • argv:命令行参数数组(如:--style fusion);

    复制代码
      QApplication a(argc, argv);
  • 创建一个 QApplication 对象 a

  • 它会完成以下工作:

    • 初始化 Qt 内部资源;
    • 设置平台相关的图形支持;
    • 处理命令行参数(例如设置样式、字体等);
  • 每个 Qt GUI 程序只能有一个 QApplication 实例。

    复制代码
      Widget w;
  • 创建一个 Widget 类的对象 w

  • 这是你自己设计的主窗口;

  • 如果你使用了 Qt Designer 设计 .ui 文件,那么这个窗口就是你拖拽出来的界面布局。

    复制代码
      w.show();
  • 调用 show() 方法将窗口显示出来;

  • 默认情况下,Qt 控件是隐藏状态;

  • 必须调用 show() 才能让用户看到窗口。

    复制代码
      return a.exec();
  • 启动 Qt 的主事件循环;

  • exec() 是一个阻塞函数,它会一直运行直到所有窗口关闭或调用了 QApplication::quit()

  • 在此期间,Qt 会不断监听并处理各种事件:

    • 鼠标点击
    • 键盘输入
    • 定时器事件
    • 窗口重绘等

✅ 总结流程图

复制代码
程序启动
│
├─ 创建 QApplication 对象 → 初始化 Qt 环境
│
├─ 创建主窗口对象 Widget w
│
├─ 显示窗口 w.show()
│
└─ 进入事件循环 a.exec() ───→ 等待用户交互
                             │
                             └── 用户关闭窗口 → 退出循环 → 返回 main() → 程序结束

💡 小贴士

技巧 说明
设置窗口标题 Widget 构造函数中添加 setWindowTitle("我的 Qt 程序");
设置窗口大小 使用 resize(800, 600);
添加图标 使用 setWindowIcon(QIcon(":/icon.png"));
全屏/最大化 使用 showFullScreen()showMaximized()

🧩 常见问题

Q1:为什么不能使用 QCoreApplication

  • 因为你的程序是 GUI 程序,需要图形界面支持;
  • QCoreApplication 只适用于控制台程序或非图形程序;
  • GUI 程序必须使用 QApplication

Q2:可以没有 QApplication 吗?

  • 不可以,GUI 程序必须有且只有一个 QApplication 实例;
  • 否则程序无法正常运行。

如果你希望我帮你:

  • 补全 widget.cppwidget.h
  • 添加菜单栏、工具栏;
  • 实现按钮点击功能;
  • 或者美化界面布局;

都可以继续提问 😊

bash 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>971</width>
    <height>683</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <widget class="QPushButton" name="btnRead">
   <property name="geometry">
    <rect>
     <x>70</x>
     <y>90</y>
     <width>101</width>
     <height>51</height>
    </rect>
   </property>
   <property name="text">
    <string>读取文件</string>
   </property>
  </widget>
  <widget class="QPushButton" name="btnWrite">
   <property name="geometry">
    <rect>
     <x>190</x>
     <y>90</y>
     <width>101</width>
     <height>51</height>
    </rect>
   </property>
   <property name="text">
    <string>写入文件</string>
   </property>
  </widget>
  <widget class="QPushButton" name="btnstreamRead">
   <property name="geometry">
    <rect>
     <x>310</x>
     <y>90</y>
     <width>101</width>
     <height>51</height>
    </rect>
   </property>
   <property name="text">
    <string>Stream读取</string>
   </property>
  </widget>
  <widget class="QPushButton" name="btnstreamWrite">
   <property name="geometry">
    <rect>
     <x>430</x>
     <y>90</y>
     <width>101</width>
     <height>51</height>
    </rect>
   </property>
   <property name="text">
    <string>Stream写入</string>
   </property>
  </widget>
  <widget class="QPushButton" name="btnQFileDialog">
   <property name="geometry">
    <rect>
     <x>70</x>
     <y>180</y>
     <width>101</width>
     <height>51</height>
    </rect>
   </property>
   <property name="text">
    <string>打开文件选择框</string>
   </property>
  </widget>
  <widget class="QPushButton" name="btnSe">
   <property name="geometry">
    <rect>
     <x>190</x>
     <y>180</y>
     <width>101</width>
     <height>51</height>
    </rect>
   </property>
   <property name="text">
    <string>分步骤打开</string>
   </property>
  </widget>
  <widget class="QPushButton" name="btnSave">
   <property name="geometry">
    <rect>
     <x>310</x>
     <y>180</y>
     <width>101</width>
     <height>51</height>
    </rect>
   </property>
   <property name="text">
    <string>保存文件</string>
   </property>
  </widget>
  <widget class="QComboBox" name="comboBox">
   <property name="geometry">
    <rect>
     <x>430</x>
     <y>180</y>
     <width>101</width>
     <height>51</height>
    </rect>
   </property>
   <item>
    <property name="text">
     <string>GBK</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>GB2312</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>UTF-8</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>ANSI</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>UTF-16</string>
    </property>
   </item>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

你提供的这段 XML 是 Qt 项目中由 Qt Designer 生成的 .ui 文件,它描述了你的主窗口界面布局和控件信息。


📄 概述

这个 .ui 文件定义了一个名为 Widget 的窗口类(继承自 QWidget),包含以下控件:

控件名 类型 功能
btnRead QPushButton 用于读取文件内容
btnWrite QPushButton 用于写入文件内容
btnstreamRead QPushButton 使用 QTextStream 流方式读取文件
btnstreamWrite QPushButton 使用 QTextStream 流方式写入文件
btnQFileDialog QPushButton 打开文件选择对话框
btnSe QPushButton 多选文件并显示路径
btnSave QPushButton 保存文件到指定路径
comboBox QComboBox 下拉列表,用于选择编码格式

✅ 界面结构解析

主窗口设置

复制代码
<widget class="QWidget" name="Widget">
 <property name="geometry">
  <rect>
   <x>0</x>
   <y>0</y>
   <width>971</width>
   <height>683</height>
  </rect>
 </property>
 <property name="windowTitle">
  <string>Widget</string>
 </property>
  • 窗口大小为 971x683
  • 标题为 "Widget"

按钮控件

btnRead ------ 读取文件按钮
复制代码
<widget class="QPushButton" name="btnRead">
 <property name="geometry">
  <rect>
   <x>70</x>
   <y>90</y>
   <width>101</width>
   <height>51</height>
  </rect>
 </property>
 <property name="text">
  <string>读取文件</string>
 </property>
</widget>
  • 坐标位置:(70, 90)
  • 尺寸:101x51
  • 显示文字:"读取文件"
btnWrite ------ 写入文件按钮
复制代码
<widget class="QPushButton" name="btnWrite">
 <property name="geometry">
  <rect>
   <x>190</x>
   <y>90</y>
   <width>101</width>
   <height>51</height>
  </rect>
 </property>
 <property name="text">
  <string>写入文件</string>
 </property>
</widget>
  • 相邻排列在右侧
  • 功能:向文件写入数据
btnstreamRead ------ 使用流方式读取文件
复制代码
<widget class="QPushButton" name="btnstreamRead">
 ...
 <property name="text">
  <string>Stream读取</string>
 </property>
</widget>
  • 使用 QTextStream 实现文本逐行读取
btnstreamWrite ------ 使用流方式写入文件
复制代码
<widget class="QPushButton" name="btnstreamWrite">
 ...
 <property name="text">
  <string>Stream写入</string>
 </property>
</widget>
  • 使用 QTextStream 向文件写入内容
btnQFileDialog ------ 打开文件选择框
复制代码
<widget class="QPushButton" name="btnQFileDialog">
 ...
 <property name="text">
  <string>打开文件选择框</string>
 </property>
</widget>
  • 弹出 QFileDialog,让用户选择一个文件进行操作
btnSe ------ 分步骤打开多个文件
复制代码
<widget class="QPushButton" name="btnSe">
 ...
 <property name="text">
  <string>分步骤打开</string>
 </property>
</widget>
  • 支持多选文件,并将路径打印到控制台
btnSave ------ 保存文件
复制代码
<widget class="QPushButton" name="btnSave">
 ...
 <property name="text">
  <string>保存文件</string>
 </property>
</widget>
  • 弹出保存文件对话框,写入用户输入的内容

下拉列表框:comboBox

复制代码
<widget class="QComboBox" name="comboBox">
 <property name="geometry">
  <rect>
   <x>430</x>
   <y>180</y>
   <width>101</width>
   <height>51</height>
  </rect>
 </property>
 <item><property name="text"><string>GBK</string></property></item>
 <item><property name="text"><string>GB2312</string></property></item>
 <item><property name="text"><string>UTF-8</string></property></item>
 <item><property name="text"><string>ANSI</string></property></item>
 <item><property name="text"><string>UTF-16</string></property></item>
</widget>
  • 可选项包括常见的字符编码格式;
  • 当前值变化时会触发 oncurrentIndexChanged(int index) 槽函数;
  • 输出当前索引和对应的编码名称到调试输出窗口。

🔄 连接关系

复制代码
<connections/>
  • 当前没有手动连接任何信号与槽;
  • 所有连接都是通过命名规范自动完成的(如 on_btnRead_clicked());

✅ 总结功能图

复制代码
+-------------------------------------------------------+
|                       Widget                          |
|                                                       |
| [读取文件] [写入文件] [Stream读取] [Stream写入]       |
|                                                       |
| [打开文件选择框] [分步骤打开] [保存文件] [下拉编码框] |
|                                                       |
+-------------------------------------------------------+

💡 小贴士

技巧 说明
更改控件名 在 Qt Designer 中右键控件 → "Change objectName"
添加新控件 拖拽即可,Qt 会自动生成代码
自动连接机制 遵循 on_<objectName>_<signalName>() 格式即可
调试输出 使用 qDebug() << "..." 输出调试信息
文件路径 推荐使用相对路径或 QStandardPaths 获取系统路径

如果你希望我帮你:

  • 补全 .cpp.h 文件;
  • 添加新的控件和功能;
  • 实现更复杂的逻辑(如多线程、文件监控等);
  • 或者美化界面布局;

都可以继续提问 😊

相关推荐
sg_knight2 小时前
Spring Cloud LoadBalancer深度解析:官方负载均衡方案迁移指南与避坑实践
java·spring boot·spring·spring cloud·微服务·负载均衡
_何同学2 小时前
Ollama 安装 DeepSeek 与 Spring Boot 集成指南
java·spring boot·后端·ai
虾球xz4 小时前
CppCon 2016 学习:GAME ENGINE USING C++11
大数据·开发语言·c++·学习
Jet45054 小时前
第100+42步 ChatGPT学习:R语言实现阈值调整
开发语言·学习·chatgpt·r语言
虾球xz4 小时前
CppCon 2016 学习:fixed_point Library
开发语言·c++·学习
希希不嘻嘻~傻希希4 小时前
CSS 字体与文本样式笔记
开发语言·前端·javascript·css·ecmascript
Code季风4 小时前
跨语言RPC:使用Java客户端调用Go服务端的HTTP-RPC服务
java·网络协议·http·rpc·golang
盖世英雄酱581364 小时前
时间设置的是23点59分59秒,数据库却存的是第二天00:00:00
java·数据库·后端
HaiQinyanAN4 小时前
【学习笔记】nlohmannjson&&cjson
c++·笔记·学习·json
C语言小火车4 小时前
【C语言】银行账户管理系统丨源码+解析
c语言·c++·算法·课程设计