Files
HuajisheTools/main.cpp
2025-07-20 11:34:53 +08:00

510 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <QApplication>
#include <QLabel>
#include <QWidget>
#include <QObject>
#include <QPushButton>
#include <QMessageBox>
#include <QHBoxLayout>
#include <QDesktopServices>
#include <QSplitter>
#include <QTreeView>
#include <QFileSystemModel>
#include <QFileDialog>
#include <QUrl>
#include <QLineEdit>
#include <QFontComboBox>
#include <QSpinBox>
#include <QCheckBox>
#include <QColor>
#include <QColorDialog>
#include <QDialogButtonBox>
#include "ui_mainwindow.h"
#include "ui_about.h"
#include "ui_information.h"
//#include "ui_fontch.h"
int main(int argc, char* argv[]){
QApplication app(argc, argv);
QIcon icon(":/favicon.ico");
QMainWindow* M;
M = new QMainWindow();
M->setWindowIcon(icon);
Ui::MainWindow* uu;
uu = new Ui::MainWindow();
uu->setupUi(M);
uu->actionSave->setShortcut(QKeySequence::Save);
uu->actionOpen->setShortcut(QKeySequence::Open);
uu->actionNewFile->setShortcut(QKeySequence::New);
uu->actionDelete->setShortcut(QKeySequence::Delete);
QString dir;
//左侧树状图
QTreeView* tree = new QTreeView(M);
tree->resize(50,M->height());
//设置文件路径
QFileSystemModel* model = new QFileSystemModel(M);
model->setRootPath(QDir::homePath());
tree->setModel(model);
QString path = QDir::homePath();
//右侧的代码区
QTextEdit* editor = new QTextEdit;
QFont codeFont("JetBrains Mono");
codeFont.setPointSize(11);
editor->setFont(codeFont);
//editor->setText("<h3>这里是右侧编辑器区域</h3>");
// 在构造函数中添加
QString placeholder = "这里是右侧编辑器区域";
editor->setTextColor(Qt::gray);
editor->setPlainText(placeholder);
// 是否在显示提示文本
bool showingPlaceholder = true;
// 当文本编辑框获得焦点
QObject::connect(editor, &QTextEdit::textChanged, M, [=]() mutable {
if (showingPlaceholder && editor->toPlainText() != placeholder && showingPlaceholder == true) {
showingPlaceholder = false;
editor->setTextColor(Qt::black);
editor->clear();
}
});
// 如果不想在 textChanged 中重复 setPlainText可在 focusInEvent/focusOutEvent 中更优雅地控制(进阶可加)
//NewFile的时候
QObject::connect(
uu->actionNewFile,
&QAction::triggered,
M,
[&](){
QString fileName = QFileDialog::getSaveFileName(M, "新建文件", QDir::homePath(), "所有文件 (*.*)");
if (!fileName.isEmpty()) {
QFile file(fileName);
QFileInfo fileinfo(fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
file.close(); // 创建空文件(也可以先写入一些内容)
editor->clear();
editor->setReadOnly(false);
path = fileinfo.absolutePath();
//qDebug() << path << Qt::endl;
QMessageBox::information(M, "成功", "文件已创建: " + fileName);
model->setRootPath(path);
tree->setRootIndex(model->index(path));
} else {
QMessageBox::warning(M, "失败", "无法创建文件: " + fileName);
}
}
}
);
//Open的时候
QObject::connect(
uu->actionOpen,
&QAction::triggered,
M,
[&](){
dir = QFileDialog::getExistingDirectory(M, "选择一个目录", QDir::homePath());
model->setRootPath(dir);
tree->setRootIndex(model->index(dir));
}
);
//Delete的时候
QObject::connect(
uu->actionDelete,
&QAction::triggered,
M,
[&]()
{
QModelIndex index = tree->currentIndex(); // 获取当前选中的项
if (!index.isValid()) {
QMessageBox::warning(M, "未选择", "请先选中要删除的文件或目录。");
return;
}
QString paths = model->filePath(index);
QFileInfo info(paths);
// 弹出确认对话框
if (QMessageBox::question(M, "确认删除", "确定要删除吗?\n" + paths)
!= QMessageBox::Yes) {
return;
}
bool success = false;
if (info.isDir()) {
QDir dir(paths);
success = dir.removeRecursively(); // 删除整个目录
} else {
QFile file(paths);
success = file.remove(); // 删除单个文件
}
if (success) {
QMessageBox::information(M, "删除成功", "已删除: " + paths);
// 刷新当前目录
QString parentPath = info.absolutePath();
model->setRootPath("");
model->setRootPath(parentPath);
tree->setRootIndex(model->index(parentPath));
editor->clear();
} else {
QMessageBox::warning(M, "删除失败", "无法删除文件或目录。");
}
}
);
//Save的时候
QObject::connect(
uu->actionSave,
&QAction::triggered,
M,
[&](){
//save
if (path.isEmpty()) {
QMessageBox::warning(M, "错误", "没有打开任何文件!");
return;
}
QFile file(path);
QFileInfo fileinfo(path);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QString content = editor->toPlainText();
file.write(content.toUtf8());
file.close();
QMessageBox::information(M, "保存成功", "文件已保存到:" + path);
QString w = fileinfo.absolutePath();
model->setRootPath("");
model->setRootPath(w);
tree->setRootIndex(model->index(w));
} else {
QMessageBox::warning(M, "保存失败", "无法写入文件:" + path);
}
}
);
//SaveAs的时候
QObject::connect(
uu->actionSaveas,
&QAction::triggered,
M,
[&](){
QString saveas = QFileDialog::getSaveFileName(M, "另存为", path);
if (!saveas.isEmpty()) {
QFile file(saveas);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QString content = editor->toPlainText();
file.write(content.toUtf8());
file.close();
QMessageBox::information(M, "另存为成功", "文件已保存到:" + saveas);
} else {
QMessageBox::warning(M, "另存为失败", "无法写入文件:" + saveas);
}
}
else{
QMessageBox::warning(M, "错误", "文件名称路径设置有误!");
return;
}
}
);
//tree视图中打开代码
QObject::connect(
tree,
&QTreeView::clicked,
M,
[&](const QModelIndex& index){
path = model->filePath(index);
QFileInfo info(path);
if (info.isFile()) {
QFile file(path);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString content = file.readAll();
editor->setPlainText(content); // 显示到右侧编辑器
editor->setReadOnly(false); // 可编辑
file.close();
} else {
editor->setPlainText("无法打开文件:" + dir);
}
} else {
// 如果是目录可以忽略或清空右侧
editor->clear();
}
}
);
//把字体做了----------------------------------------------------------------------------
//字体大小
QObject::connect(
uu->actionSize,
&QAction::triggered,
M,
[&](){
QDialog* dFont = new QDialog(M);
dFont->setWindowTitle("设置字体大小");
dFont->resize(200,100);
QLabel *label = new QLabel("请输入字体大小px", dFont);
QLineEdit* input = new QLineEdit(M);
input->setPlaceholderText("例如16");
QPushButton *okButton = new QPushButton("确定", dFont);
QPushButton *cancelButton = new QPushButton("取消", dFont);
QHBoxLayout *btnLayout = new QHBoxLayout();
btnLayout->addWidget(okButton);
btnLayout->addWidget(cancelButton);
QVBoxLayout *mainLayout = new QVBoxLayout(dFont);
mainLayout->addWidget(label);
mainLayout->addWidget(input);
mainLayout->addLayout(btnLayout);
QObject::connect(okButton, &QPushButton::clicked, dFont, [&](){
bool ok;
int fontSize = input->text().toInt(&ok);
if (ok && fontSize > 0) {
// 在这里添加设置字体大小的逻辑
codeFont.setPointSize(fontSize);
editor->setFont(codeFont);
dFont->close();
} else {
QMessageBox::warning(dFont, "错误", "请输入有效的字体大小");
}
});
QObject::connect(cancelButton, &QPushButton::clicked, dFont, [=](){
dFont->close();
});
dFont->exec();
//exec是动态模比较好close可以关闭
}
);
//字体设置(新窗口通过转盘选择) 大项目,把颜色,大小,字体等相关操作都融入进去
//Ui::Fontch* fontch = new Ui::Fontch();
//QWidget* fontset = new QWidget();
//不能多次删改一个Widget
//fontch->setupUi(fontset);
QObject::connect(uu->actionFont,&QAction::triggered,M,[&](){
QDialog* fontset = new QDialog();
// 字体选择
QFontComboBox *fontCombo = new QFontComboBox(fontset);
// 字号选择
QSpinBox *sizeSpin = new QSpinBox(fontset);
sizeSpin->setRange(6, 72);
sizeSpin->setValue(16);
// 加粗、斜体
QCheckBox *boldCheck = new QCheckBox("加粗", fontset);
QCheckBox *italicCheck = new QCheckBox("斜体", fontset);
// 颜色选择按钮
QPushButton *colorBtn = new QPushButton("选择颜色", fontset);
QColor currentColor = Qt::black;
// 示例展示标签
QLabel *previewLabel = new QLabel("字体预览", fontset);
previewLabel->setMinimumHeight(40);
previewLabel->setAlignment(Qt::AlignCenter);
// 更新样式的函数
auto updatePreview = [=, &currentColor]() mutable {
QFont font(fontCombo->currentFont());
font.setPointSize(sizeSpin->value());
font.setBold(boldCheck->isChecked());
font.setItalic(italicCheck->isChecked());
previewLabel->setFont(font);
QPalette pal = previewLabel->palette();
pal.setColor(QPalette::WindowText, currentColor);
previewLabel->setPalette(pal);
qDebug() << "ReNewed" << Qt::endl;
};
// 响应颜色按钮点击
QObject::connect(colorBtn, &QPushButton::clicked, fontset, [=, &currentColor]() mutable {
QColor color = QColorDialog::getColor(currentColor, fontset, "选择颜色");
if (color.isValid()) {
currentColor = color;
updatePreview();
}
});
// 连接所有变化信号
QObject::connect(fontCombo, &QFontComboBox::currentFontChanged, fontset, updatePreview);
QObject::connect(sizeSpin, QOverload<int>::of(&QSpinBox::valueChanged), fontset, updatePreview);
QObject::connect(boldCheck, &QCheckBox::toggled, fontset, updatePreview);
QObject::connect(italicCheck, &QCheckBox::toggled, fontset, updatePreview);
//确定修改按钮
QDialogButtonBox *buttonBoxs = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, fontset);
QObject::connect(buttonBoxs, &QDialogButtonBox::accepted, fontset, [=]() {
QFont finalFont = fontCombo->currentFont();
finalFont.setPointSize(sizeSpin->value());
finalFont.setBold(boldCheck->isChecked());
finalFont.setItalic(italicCheck->isChecked());
editor->setFont(finalFont);
QPalette pal = editor->palette();
pal.setColor(QPalette::Text, currentColor); // 注意你用的是 currentColor
editor->setPalette(pal);
fontset->close();
});
// 布局整理
QGridLayout *layout = new QGridLayout;
layout->addWidget(new QLabel("字体:"), 0, 0);
layout->addWidget(fontCombo, 0, 1);
layout->addWidget(new QLabel("大小:"), 1, 0);
layout->addWidget(sizeSpin, 1, 1);
layout->addWidget(new QLabel("颜色:"), 2, 0);
layout->addWidget(colorBtn, 2, 1, 1, 1);
layout->addWidget(boldCheck, 3, 1);
layout->addWidget(italicCheck, 3, 2);
layout->addWidget(previewLabel, 4, 0, 1, 2);
layout->addWidget(buttonBoxs, 5, 0);
// 你可以把 layout 放到设置页或主窗口中的某个容器里,比如:
fontset->setLayout(layout);
fontset->exec();
});
//主页面
QSplitter* mainsp = new QSplitter();
mainsp->addWidget(tree);
mainsp->addWidget(editor);
M->setCentralWidget(mainsp);
//qDebug() << "第一处" << mainsp->sizes() << Qt::endl;
//mainsp->setSizes({2,8});
//↑这里不能设置,窗口还没有初始化
//关于部分的窗口设置
QWidget* aboutq = new QWidget();
//关于-声明
Ui::about* about;
about = new Ui::about;
about->setupUi(aboutq);
QObject::connect(
uu->actionStatement,
&QAction::triggered,
M,
[&]{
about->label->setText("<h3>请认真阅读下列文字,阅读后点击“我已阅读”");
aboutq->setWindowTitle("声明");
aboutq->show();
}
);
QObject::connect(
about->button,
&QPushButton::clicked,
M,
[&]{
aboutq->close();
}
);
//关于-信息
Ui::information* info = new Ui::information();
QWidget* abouti = new QWidget();
info->setupUi(abouti);
QObject::connect(
uu->actionInformation,
&QAction::triggered,
M,
[&]{
abouti->setWindowTitle("信息-Version1.0");
abouti->show();
}
);
QObject::connect(
info->button,
&QPushButton::clicked,
M,
[&]{
abouti->close();
}
);
//关于-联系
QObject::connect(
uu->actionHuajishe,
&QAction::triggered,
M,
[&]{
QDesktopServices::openUrl(QUrl("https://huajishe.fun"));
}
);
QObject::connect(
uu->actione2hang,
&QAction::triggered,
M,
[&]{
QDesktopServices::openUrl(QUrl("https://huajishe.fun/forum"));
}
);
//关于-查看进度
QObject::connect(
uu->actiontutorial,
&QAction::triggered,
M,
[&]{
QDesktopServices::openUrl(QUrl("https://huajishe.fun/help"));
}
);
//附加参数的启动方式
// 默认最大化
bool modeSet = false;
// 检查参数
for (int i = 1; i < argc - 1; ++i) {
QString arg = argv[i];
if (arg == "-window") {
QString mode = argv[i + 1];
if (mode == "f") {
M->showFullScreen();
modeSet = true;
} else if (mode == "m") {
M->showMaximized();
modeSet = true;
} else if (mode == "s") {
M->show(); // 正常窗口
modeSet = true;
}
break; // 找到 -window 后只处理一次
}
}
if (!modeSet) {
M->showMaximized(); // 默认最大化
}
//qDebug() << "第二处" << mainsp->sizes() << Qt::endl;
int mwt, mwe;
mwt = M->width() * 0.2;
mwe = M->width() * 0.8;
mainsp->setSizes({ mwt , mwe });
qDebug() << "Success" << Qt::endl;
return app.exec();
}