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 0000000..247464f Binary files /dev/null and b/resource/favicon.ico differ 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 + +