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
文件生成,包含了所有界面元素的定义;QFile
和QFileDialog
:用于文件操作和打开文件对话框。
构造函数
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
; - 更好的做法是使用
QByteArray
或QString
来避免手动管理内存。
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.cpp
和widget.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
文件; - 添加新的控件和功能;
- 实现更复杂的逻辑(如多线程、文件监控等);
- 或者美化界面布局;
都可以继续提问 😊