From 9209337d1b87a2ad449cf67c2456c51eb8e3037b Mon Sep 17 00:00:00 2001 From: taynpg Date: Mon, 3 Mar 2025 22:56:33 +0800 Subject: [PATCH] v1.0 --- .vscode/settings.json | 3 +- CMakeLists.txt | 64 ++++++++++++++--- main.cpp | 11 ++- mainwidget.cpp | 162 ++++++++++++++++++++++++++++++++++++++++++ mainwidget.h | 35 +++++++++ mainwidget.ui | 116 ++++++++++++++++++++++++++++++ mainwindow.cpp | 15 ---- mainwindow.h | 21 ------ mainwindow.ui | 22 ------ resource/favicon.ico | Bin 0 -> 15406 bytes resource/ico.rc | 1 + std_reg.qrc | 5 ++ 12 files changed, 385 insertions(+), 70 deletions(-) create mode 100644 mainwidget.cpp create mode 100644 mainwidget.h create mode 100644 mainwidget.ui delete mode 100644 mainwindow.cpp delete mode 100644 mainwindow.h delete mode 100644 mainwindow.ui create mode 100644 resource/favicon.ico create mode 100644 resource/ico.rc create mode 100644 std_reg.qrc diff --git a/.vscode/settings.json b/.vscode/settings.json index 0bc16b9..89f4d42 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -163,7 +163,8 @@ "qfiledialog": "cpp", "qvboxlayout": "cpp", "qapplication": "cpp", - "qmessagebox": "cpp" + "qmessagebox": "cpp", + "qmainwindow": "cpp" }, "makefile.configureOnOpen": false, "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", diff --git a/CMakeLists.txt b/CMakeLists.txt index 91c2adc..591d3d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(std_reg LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) +project(std_reg VERSION 1.0 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) @@ -15,14 +13,62 @@ if (MSVC) add_compile_options(/utf-8) endif() -find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) -add_executable(std_reg - main.cpp - mainwindow.cpp - mainwindow.h - mainwindow.ui +set(PROJECT_SOURCES + main.cpp + mainwidget.cpp + mainwidget.h resource/ico.rc + mainwidget.ui std_reg.qrc ) +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) + qt_add_executable(std_reg + MANUAL_FINALIZATION + ${PROJECT_SOURCES} + ) +# Define target properties for Android with Qt 6 as: +# set_property(TARGET std_reg APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR +# ${CMAKE_CURRENT_SOURCE_DIR}/android) +# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation +else() + if(ANDROID) + add_library(std_reg SHARED + ${PROJECT_SOURCES} + ) +# Define properties for Android with Qt 5 after find_package() calls as: +# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") + else() + add_executable(std_reg + ${PROJECT_SOURCES} + ) + endif() +endif() + target_link_libraries(std_reg PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) + +# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. +# If you are developing for iOS or macOS you should consider setting an +# explicit, fixed bundle identifier manually though. +if(${QT_VERSION} VERSION_LESS 6.1.0) + set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.std_reg) +endif() +set_target_properties(std_reg PROPERTIES + ${BUNDLE_ID_OPTION} + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +include(GNUInstallDirs) +install(TARGETS std_reg + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +if(QT_VERSION_MAJOR EQUAL 6) + qt_finalize_executable(std_reg) +endif() diff --git a/main.cpp b/main.cpp index fd3e533..f2f89a8 100644 --- a/main.cpp +++ b/main.cpp @@ -1,11 +1,18 @@ -#include "mainwindow.h" +#include "mainwidget.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); - MainWindow w; + + QFont font = a.font(); + font.setHintingPreference(QFont::PreferNoHinting); + font.setPointSize(13); + a.setFont(font); + + CTryReg w; + a.setStyle("windows"); w.show(); return a.exec(); } diff --git a/mainwidget.cpp b/mainwidget.cpp new file mode 100644 index 0000000..65c4dab --- /dev/null +++ b/mainwidget.cpp @@ -0,0 +1,162 @@ +#include "mainwidget.h" +#include "./ui_mainwidget.h" +#include +#include +#include + +CTryReg::CTryReg(QWidget* parent) : QWidget(parent), ui(new Ui::CTryReg) +{ + ui->setupUi(this); + + setWindowTitle("STD_REG 1.0"); + ui->edRet->setReadOnly(true); + connect(ui->btnSearch, &QPushButton::clicked, this, &CTryReg::reg_search); + connect(ui->btnMatch, &QPushButton::clicked, this, &CTryReg::reg_match); + connect(ui->btnIterator, &QPushButton::clicked, this, &CTryReg::reg_iterator); + connect(ui->btnExit, &QPushButton::clicked, this, &CTryReg::close); + connect(ui->btnOpenHis, &QPushButton::clicked, this, &CTryReg::open_his); + + QString home = QDir::homePath(); + QDir dir(home); + his_path_ = dir.absoluteFilePath(".config/std_reg"); + QDir path(his_path_); + if (!path.exists()) { + path.mkpath(his_path_); + } + his_path_ = his_path_ + "/history.txt"; +} + +CTryReg::~CTryReg() +{ + delete ui; +} + +void CTryReg::reg_search() +{ + ui->listWidget->clear(); + ui->edRet->clear(); + std::string pattern = ui->edReg->text().toStdString(); + std::string str = ui->plainTextEdit->toPlainText().toStdString(); + + if (pattern.empty() || str.empty()) { + return; + } + try { + std::smatch match; + std::regex rg(pattern); + if (std::regex_search(str, match, rg)) { + ui->edRet->setText("Success."); + for (const auto& m : match) { + ui->listWidget->addItem(QString::fromStdString(m.str())); + } + } else { + ui->edRet->setText("Failed."); + } + } catch (const std::exception& e) { + ui->edRet->setText(QString::fromStdString(e.what())); + } + append_his(QString::fromStdString(str), QString::fromStdString(pattern)); +} + +void CTryReg::reg_match() +{ + ui->listWidget->clear(); + ui->edRet->clear(); + std::string pattern = ui->edReg->text().toStdString(); + std::string str = ui->plainTextEdit->toPlainText().toStdString(); + + if (pattern.empty() || str.empty()) { + return; + } + try { + std::regex rg(pattern); + if (std::regex_match(str, rg)) { + ui->edRet->setText("Success."); + } else { + ui->edRet->setText("Failed."); + } + } catch (const std::exception& e) { + ui->edRet->setText(QString::fromStdString(e.what())); + } + append_his(QString::fromStdString(str), QString::fromStdString(pattern)); +} + +void CTryReg::reg_iterator() +{ + ui->listWidget->clear(); + ui->edRet->clear(); + std::string pattern = ui->edReg->text().toStdString(); + std::string str = ui->plainTextEdit->toPlainText().toStdString(); + + if (pattern.empty() || str.empty()) { + return; + } + try { + std::regex rg(pattern); + auto begin = std::sregex_iterator(str.begin(), str.end(), rg); + auto end = std::sregex_iterator(); + if (begin != end) { + ui->edRet->setText("Success."); + while (begin != end) { + for (const auto& item : *begin) { + ui->listWidget->addItem(QString::fromStdString(item.str())); + } + ++begin; + } + } else { + ui->edRet->setText("Failed."); + } + } catch (const std::exception& e) { + ui->edRet->setText(QString::fromStdString(e.what())); + } + append_his(QString::fromStdString(str), QString::fromStdString(pattern)); +} + +bool CTryReg::append_his(const QString& da, const QString& db) +{ + QFile file(his_path_); + if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { + return false; + } + + QTextStream in(&file); + QString content = in.readAll(); + + QString search_pattern = "【字符串】\n" + da + "\n【表达式】\n" + db + "\n"; + if (content.contains(search_pattern)) { + file.close(); + return true; + } + + QTextStream out(&file); + out.setDevice(&file); // 重新设置输出流到文件末尾 + QString currentDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); + out << currentDateTime << "\n"; + out << "【字符串】\n" << da << "\n"; + out << "【表达式】\n" << db << "\n\n"; + file.close(); + return true; +} + +void CTryReg::open_his() +{ + if (!QFileInfo::exists(his_path_)) { + QMessageBox::warning(nullptr, "错误", "文件不存在:" + his_path_); + return; + } + +#ifdef Q_OS_WIN + // Windows 系统使用 "notepad" 或者直接调用文件 + process.start("notepad", QStringList() << his_path_); +#elif defined(Q_OS_MAC) + // macOS 系统使用 "open" 命令 + process.start("open", QStringList() << his_path_); +#else + // Linux 或其他类 Unix 系统使用 "xdg-open" + process.start("xdg-open", QStringList() << his_path_); +#endif + // 检查是否启动成功 + if (!process.waitForStarted()) { + QMessageBox::warning(nullptr, "错误", "无法启动系统编辑器!"); + } +} diff --git a/mainwidget.h b/mainwidget.h new file mode 100644 index 0000000..80824ce --- /dev/null +++ b/mainwidget.h @@ -0,0 +1,35 @@ +#ifndef MAINWIDGET_H +#define MAINWIDGET_H + +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { +class CTryReg; +} +QT_END_NAMESPACE + +class CTryReg : public QWidget +{ + Q_OBJECT + +public: + CTryReg(QWidget *parent = nullptr); + ~CTryReg(); + +private: + void reg_search(); + void reg_match(); + void reg_iterator(); + bool append_his(const QString& da, const QString& db); + void open_his(); + +private: + QString his_path_{}; + QProcess process; + +private: + Ui::CTryReg *ui; +}; +#endif // MAINWIDGET_H diff --git a/mainwidget.ui b/mainwidget.ui new file mode 100644 index 0000000..c962426 --- /dev/null +++ b/mainwidget.ui @@ -0,0 +1,116 @@ + + + CTryReg + + + + 0 + 0 + 1162 + 426 + + + + CTryReg + + + + + + + + + + 字符串 + + + + + + + + + + + + + + 结果 + + + + + + + + + + + + + + + + 表达式: + + + + + + + + + + + + + + 成功否: + + + + + + + + + + 退出 + + + + + + + 打开历史 + + + + + + + search + + + + + + + match + + + + + + + iterator + + + + + + + + + + diff --git a/mainwindow.cpp b/mainwindow.cpp deleted file mode 100644 index a06fc8e..0000000 --- a/mainwindow.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "mainwindow.h" -#include "./ui_mainwindow.h" - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) - , ui(new Ui::MainWindow) -{ - ui->setupUi(this); -} - -MainWindow::~MainWindow() -{ - delete ui; -} - diff --git a/mainwindow.h b/mainwindow.h deleted file mode 100644 index 4643e32..0000000 --- a/mainwindow.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include - -QT_BEGIN_NAMESPACE -namespace Ui { class MainWindow; } -QT_END_NAMESPACE - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - MainWindow(QWidget *parent = nullptr); - ~MainWindow(); - -private: - Ui::MainWindow *ui; -}; -#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui deleted file mode 100644 index b232854..0000000 --- a/mainwindow.ui +++ /dev/null @@ -1,22 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - - - diff --git a/resource/favicon.ico b/resource/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..247464f895063ba9878a427b1c0811c7073cb987 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/resource/ico.rc b/resource/ico.rc new file mode 100644 index 0000000..da3e7bc --- /dev/null +++ b/resource/ico.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "favicon.ico" \ No newline at end of file diff --git a/std_reg.qrc b/std_reg.qrc new file mode 100644 index 0000000..2f36ca8 --- /dev/null +++ b/std_reg.qrc @@ -0,0 +1,5 @@ + + + resource/favicon.ico + +