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 0000000..82ca495 Binary files /dev/null and b/res/img/btn/btn_info_browser.png differ 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("