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("