From aba2524edfa0a2c611007144d61de123c7ed06c0 Mon Sep 17 00:00:00 2001 From: JackLee <809262979@qq.com> Date: Tue, 11 Mar 2025 21:09:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0html?= =?UTF-8?q?=E6=B5=8F=E8=A7=88=20=E4=BF=AE=E6=94=B9=E5=A4=A7=E5=85=AC?= =?UTF-8?q?=E5=BC=8F=E7=9A=84=E5=9B=BE=E7=89=87=E6=98=BE=E7=A4=BA=E6=96=B9?= =?UTF-8?q?=E5=BC=8F,=E9=87=87=E7=94=A8=E8=87=AA=E5=8A=A8=E6=8D=A2?= =?UTF-8?q?=E8=A1=8C=E5=8D=95=E7=8B=AC=E6=98=BE=E7=A4=BA=E5=A4=A7=E5=85=AC?= =?UTF-8?q?=E5=BC=8F=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res.qrc | 1 + res/img/btn/btn_info_browser.png | Bin 0 -> 4194 bytes res/qss/light_style.qss | 7 ++++ src/ctaiHistoryTextEdit.cpp | 25 ++++++++------ src/ctaiHistoryTextEdit.h | 9 +++--- src/ctaiHistoryTools.cpp | 6 +++- src/ctaiHistoryTools.h | 4 ++- src/ctaiHistoryWidget.cpp | 2 +- src/ctaiMathConvert.cpp | 54 +++++++++++++++++++++++++++++-- 9 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 res/img/btn/btn_info_browser.png diff --git a/res.qrc b/res.qrc index f2ca1d7..a47d34d 100644 --- a/res.qrc +++ b/res.qrc @@ -16,6 +16,7 @@ res/img/btn/default_header.png res/img/btn/btn_msg_menu.png + res/img/btn/btn_info_browser.png res/img/btn/btn_info_copy.png res/img/btn/btn_info_delete.png res/img/btn/btn_info_down.png diff --git a/res/img/btn/btn_info_browser.png b/res/img/btn/btn_info_browser.png new file mode 100644 index 0000000000000000000000000000000000000000..82ca495309362132a40dab540110fe97a1a8cdd5 GIT binary patch literal 4194 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 literal 0 HcmV?d00001 diff --git a/res/qss/light_style.qss b/res/qss/light_style.qss index 78a121c..b249fe3 100644 --- a/res/qss/light_style.qss +++ b/res/qss/light_style.qss @@ -94,6 +94,13 @@ QPushButton#m_msg_copy{ background-color: #FFFFFF; image:url(":/res/img/btn/btn_info_copy.png"); } +QPushButton#m_msg_browser{ + height:25px; + width:25px; + border:none; + background-color: #FFFFFF; + image:url(":/res/img/btn/btn_info_browser.png"); +} QPushButton#m_msg_save{ height:25px; width:25px; diff --git a/src/ctaiHistoryTextEdit.cpp b/src/ctaiHistoryTextEdit.cpp index 9b192d8..ae821a1 100644 --- a/src/ctaiHistoryTextEdit.cpp +++ b/src/ctaiHistoryTextEdit.cpp @@ -123,8 +123,9 @@ void ctaiHistoryTextEdit::connect_signals(msg_type msg_type_mode) connect(m_msg_tokens, SIGNAL(clicked()), this, SLOT(on_tokens_slots())); connect(m_msg_tools, SIGNAL(on_signals_display_mode(QString)), this, SLOT(on_display_changed(QString))); connect(m_msg_tools, SIGNAL(on_signals_display_font_size()), this, SLOT(on_display_font_size_changed())); + connect(m_msg_tools, SIGNAL(on_signals_send_browser()), this, SLOT(on_send_browser())); // save菜单功能 - connect(m_msg_tools, SIGNAL(on_signals_save_file(int)), this, SLOT(on_save_file(int))); + connect(m_msg_tools, SIGNAL(on_signals_save_file(QString,int)), this, SLOT(on_save_file(QString,int))); // 其他功能菜单 connect(m_msg_tools, SIGNAL(on_signals_menu()), this, SLOT(on_menu_slots())); } @@ -134,6 +135,11 @@ void ctaiHistoryTextEdit::connect_signals(msg_type msg_type_mode) } connect(m_msg_history, SIGNAL(textChanged()), this, SLOT(on_sync_text_height())); } +void ctaiHistoryTextEdit::on_send_browser(){ + QString save_path=QDir::currentPath()+"/html/"+m_msg_sned_id+".html"; + on_save_file(save_path,1); + QDesktopServices::openUrl(save_path); +} void ctaiHistoryTextEdit::on_menu_slots() { } @@ -153,20 +159,17 @@ void ctaiHistoryTextEdit::on_copy_slots() QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(text); } -void ctaiHistoryTextEdit::on_save_file(int index) +void ctaiHistoryTextEdit::on_save_file(QString save_path,int index) { - QString fileName; QString temp_current_content; - fileName = QFileDialog::getSaveFileName(this, tr("保存消息"), m_msg_sned_id + save_extend[index], save_extend_str[index]); - if (fileName.isEmpty()) - { - return; + if(save_path.isEmpty()){ + save_path = QFileDialog::getSaveFileName(this, tr("保存消息"), m_msg_sned_id + save_extend[index], save_extend_str[index]); } - QFile file(fileName); + QFile file(save_path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("保存失败"), - tr("无法保存文件 %1:\n%2").arg(fileName).arg(file.errorString())); + tr("无法保存文件 %1:\n%2").arg(save_path).arg(file.errorString())); return; } QTextStream out(&file); @@ -186,7 +189,7 @@ void ctaiHistoryTextEdit::on_save_file(int index) } if (!temp_current_content.isEmpty()) { - out << m_current_content << "\n\n"; + out << temp_current_content << "\n\n"; } file.close(); } @@ -212,6 +215,8 @@ void ctaiHistoryTextEdit::on_display_changed(QString mode) else if (mode == "HTML渲染" || mode == "Markdown渲染") { m_msg_history->setHtml(m_math_convert->replace_tags_svg(m_current_content, m_msg_tools->getFontSize().toInt())); + QTextDocument *doc = m_msg_history->document(); + doc->adjustSize(); } } void ctaiHistoryTextEdit::on_tokens_slots() diff --git a/src/ctaiHistoryTextEdit.h b/src/ctaiHistoryTextEdit.h index b471d44..1ee9f06 100644 --- a/src/ctaiHistoryTextEdit.h +++ b/src/ctaiHistoryTextEdit.h @@ -26,6 +26,7 @@ #include #include #include +#include // Qt对话框 #include #include @@ -36,7 +37,6 @@ #include "ctai_base.h" #include "ctaiMathConvert.h" #include "ctaiHistoryTools.h" - typedef struct tokens_args { QString prompt_tokens = {}; @@ -70,8 +70,9 @@ private slots: void on_display_changed(QString); // 显示模式改变 void on_display_font_size_changed(); // 字体大小改变 void on_sync_text_height(); - void on_save_file(int); // 保存文本 + void on_save_file(QString,int); // 保存文本 void on_menu_slots(); + void on_send_browser(); signals: void delete_requested(QString); // 请求删除此消息 void row_height_changed(bool); @@ -91,8 +92,8 @@ private: QPushButton *m_msg_system_header_ico = {}; QPushButton *m_msg_user_header_ico = {}; - QLineEdit *m_msg_header = {}; - QTextEdit *m_msg_history = {}; + QLineEdit *m_msg_header = {}; + QTextEdit *m_msg_history = {}; QPushButton *m_msg_user_del = {}; QPushButton *m_msg_system_del = {}; QPushButton *m_msg_tokens = {}; diff --git a/src/ctaiHistoryTools.cpp b/src/ctaiHistoryTools.cpp index f458de7..b59dd56 100644 --- a/src/ctaiHistoryTools.cpp +++ b/src/ctaiHistoryTools.cpp @@ -12,6 +12,7 @@ void ctaiHistoryTools::initLayout() { // 消息功能区 header_opts_Layout = new QHBoxLayout(); + m_msg_browser=new QPushButton(); m_msg_copy = new QPushButton(); m_msg_save = new QPushButton(); m_msg_menu = new QPushButton(); @@ -28,6 +29,7 @@ void ctaiHistoryTools::initLayout() m_msg_display_font_size_combobox->setObjectName("m_msg_font_size_combobox"); m_msg_display_font_label->setObjectName("m_msg_font_label"); m_msg_display_font_combobox->setObjectName("m_msg_font_combobox"); + m_msg_browser->setObjectName("m_msg_browser"); m_msg_copy->setObjectName("m_msg_copy"); m_msg_save->setObjectName("m_msg_save"); m_msg_menu->setObjectName("m_msg_menu"); @@ -42,6 +44,7 @@ void ctaiHistoryTools::initLayout() header_opts_Layout->addWidget(m_msg_display_font_size_combobox); header_opts_Layout->addWidget(m_msg_display_label); header_opts_Layout->addWidget(m_msg_display_combobox); + header_opts_Layout->addWidget(m_msg_browser); header_opts_Layout->addWidget(m_msg_copy); header_opts_Layout->addWidget(m_msg_save); header_opts_Layout->addWidget(m_msg_menu); @@ -68,6 +71,7 @@ void ctaiHistoryTools::initDisplayMode() } void ctaiHistoryTools::initConnect() { + connect(m_msg_browser, SIGNAL(clicked()), this, SIGNAL(on_signals_send_browser())); connect(m_msg_copy, SIGNAL(clicked()), this, SIGNAL(on_signals_copy())); connect(m_msg_save, SIGNAL(clicked()), this, SLOT(on_save_menu_slots())); connect(m_msg_menu, SIGNAL(clicked()), this, SLOT(on_opts_menu_slots())); @@ -98,7 +102,7 @@ void ctaiHistoryTools::on_save_menu_slots() } void ctaiHistoryTools::on_save_action_slots(){ save_index=sender()->objectName().toInt(); - emit on_signals_save_file(save_index); + emit on_signals_save_file({},save_index); } void ctaiHistoryTools::on_opts_menu_slots() { diff --git a/src/ctaiHistoryTools.h b/src/ctaiHistoryTools.h index 32cd46b..77190fd 100644 --- a/src/ctaiHistoryTools.h +++ b/src/ctaiHistoryTools.h @@ -22,6 +22,7 @@ public: QString getFont(); private: QHBoxLayout *header_opts_Layout = {}; + QPushButton *m_msg_browser={}; QPushButton *m_msg_copy = {}; QPushButton *m_msg_save = {}; QPushButton *m_msg_menu = {}; @@ -50,7 +51,8 @@ signals: void on_signals_fold(); void on_signals_display_mode(QString); void on_signals_display_font_size(); - void on_signals_save_file(int); + void on_signals_save_file(QString,int); + void on_signals_send_browser(); public slots: void on_save_menu_slots(); void on_opts_menu_slots(); diff --git a/src/ctaiHistoryWidget.cpp b/src/ctaiHistoryWidget.cpp index eacbd2a..8202faa 100644 --- a/src/ctaiHistoryWidget.cpp +++ b/src/ctaiHistoryWidget.cpp @@ -17,7 +17,7 @@ void ctaiHistoryWidget::setup_table() // 设置自动滚动属性 setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); // 滚动步长 - verticalScrollBar()->setSingleStep(5); + verticalScrollBar()->setSingleStep(10); } ctaiHistoryWidget::~ctaiHistoryWidget() diff --git a/src/ctaiMathConvert.cpp b/src/ctaiMathConvert.cpp index 40fd00d..234bae9 100644 --- a/src/ctaiMathConvert.cpp +++ b/src/ctaiMathConvert.cpp @@ -36,7 +36,7 @@ QString ctaiMathConvert::math_convert_svg(const QString &math) painter.setRenderHints(QPainter::TextAntialiasing | QPainter::Antialiasing); Graphics2D_qt g2(&painter); render->draw(g2, m_padding, m_padding); - save_svg(pix); + // save_svg(pix); return QString::fromUtf8(svg_to_base64(pix)); } @@ -67,7 +67,7 @@ QString ctaiMathConvert::clean_latex_for_mula(const QString &formula) QString ctaiMathConvert::replace_tags_svg(const QString &text, int font_size) { - m_text_size = font_size*1.5; + m_text_size = font_size * 1.5; QString result = text; // 使用改进的正则表达式模式 QRegularExpression latexPattern( @@ -119,6 +119,7 @@ QString ctaiMathConvert::markdown_to_html(const QString &text) // 启用所有 GFM 扩展选项 int options = CMARK_OPT_SOURCEPOS | CMARK_OPT_VALIDATE_UTF8 | + CMARK_OPT_HARDBREAKS | CMARK_OPT_SMART | CMARK_OPT_GITHUB_PRE_LANG | CMARK_OPT_LIBERAL_HTML_TAG | @@ -138,6 +139,55 @@ QString ctaiMathConvert::markdown_to_html(const QString &text) char *html = cmark_render_html(doc, options, NULL); // 转换回QString并处理代码块 QString result = QString::fromUtf8(html); + // 添加基础CSS样式 + const QString css = R"( + + )"; + // 在标签后插入CSS + result.replace("", "" + css); + result.replace("