调整命令

This commit is contained in:
JackLee 2025-03-29 17:57:47 +08:00
parent 8ff67ba1cd
commit 3799234c56
4 changed files with 175 additions and 133 deletions

View File

@ -52,6 +52,8 @@ CefWidget::CefWidget(QWidget *parent)
m_Layout->setStretch(1, 8); m_Layout->setStretch(1, 8);
setBaseSize(QSize(width(),height())); setBaseSize(QSize(width(),height()));
setLayout(m_Layout); setLayout(m_Layout);
setWindowFlags(Qt::Window); // 使用标准窗口样式
setAttribute(Qt::WA_TranslucentBackground, false);
initBrowser(); initBrowser();
} }
@ -66,7 +68,10 @@ void CefWidget::initBrowser()
m_CefWidget->deleteLater(); m_CefWidget->deleteLater();
m_CefWidget = nullptr; m_CefWidget = nullptr;
} }
setting.setWindowlessFrameRate(1000);
setting.setHardwareAcceleration(true); setting.setHardwareAcceleration(true);
QColor background(0, 255, 0, 255);
setting.setBackgroundColor(background);
m_CefWidget = new QCefView("about:blank", &setting, this); m_CefWidget = new QCefView("about:blank", &setting, this);
connect(m_CefWidget, &QCefView::invokeMethod, this, &CefWidget::onInvokeMethod); connect(m_CefWidget, &QCefView::invokeMethod, this, &CefWidget::onInvokeMethod);
connect(m_CefWidget, &QCefView::cefUrlRequest, this, &CefWidget::onQCefUrlRequest); connect(m_CefWidget, &QCefView::cefUrlRequest, this, &CefWidget::onQCefUrlRequest);

View File

@ -10,11 +10,12 @@ ctaiHistoryTextEdit::~ctaiHistoryTextEdit()
} }
void ctaiHistoryTextEdit::initLayout(msg_type msg_type_mode) void ctaiHistoryTextEdit::initLayout(msg_type msg_type_mode)
{ {
m_msg_type = msg_type_mode;
// 主垂直布局 // 主垂直布局
main_layout = new QVBoxLayout(); main_layout = new QVBoxLayout();
initMsgLine(); initMsgLine();
initMsgHeaderLayout(msg_type_mode); initMsgHeaderLayout();
initMsgHistoryLayout(msg_type_mode); initMsgHistoryLayout();
// 主布局 // 主布局
main_layout->addLayout(header_layout); main_layout->addLayout(header_layout);
main_layout->addLayout(history_layout); main_layout->addLayout(history_layout);
@ -24,7 +25,7 @@ void ctaiHistoryTextEdit::initLayout(msg_type msg_type_mode)
main_layout->setContentsMargins(0, 0, 0, 0); main_layout->setContentsMargins(0, 0, 0, 0);
setLayout(main_layout); setLayout(main_layout);
set_default_opts(); set_default_opts();
connect_signals(msg_type_mode); connect_signals();
} }
void ctaiHistoryTextEdit::initMsgLine() void ctaiHistoryTextEdit::initMsgLine()
{ {
@ -34,10 +35,12 @@ void ctaiHistoryTextEdit::initMsgLine()
msg_line->setFrameShadow(QFrame::Sunken); // 凹陷效果 msg_line->setFrameShadow(QFrame::Sunken); // 凹陷效果
msg_line->setLineWidth(2); // 线宽 msg_line->setLineWidth(2); // 线宽
} }
void ctaiHistoryTextEdit::initMsgHistoryLayout(msg_type msg_type_mode) void ctaiHistoryTextEdit::initMsgHistoryLayout()
{ {
history_layout = new QVBoxLayout(); history_layout = new QVBoxLayout();
// 历史信息QTextEdit // 历史信息QTextEdit
if (m_msg_type == USER)
{
m_msg_history = new QTextEdit(); m_msg_history = new QTextEdit();
m_math_convert = new ctaiMathConvert(); m_math_convert = new ctaiMathConvert();
m_msg_history->setUndoRedoEnabled(false); // 关闭撤销历史以节省内存 m_msg_history->setUndoRedoEnabled(false); // 关闭撤销历史以节省内存
@ -47,10 +50,17 @@ void ctaiHistoryTextEdit::initMsgHistoryLayout(msg_type msg_type_mode)
m_msg_history->setObjectName("m_msg_history"); m_msg_history->setObjectName("m_msg_history");
m_msg_history->setReadOnly(true); m_msg_history->setReadOnly(true);
history_layout->addWidget(m_msg_history); history_layout->addWidget(m_msg_history);
}
else
{
m_edit_cef = new CefWidget();
m_edit_cef->setMinimumHeight(600);
history_layout->addWidget(m_edit_cef);
}
history_layout->addWidget(msg_line); history_layout->addWidget(msg_line);
history_layout->setContentsMargins(0, 0, 0, 0); history_layout->setContentsMargins(0, 0, 0, 0);
} }
void ctaiHistoryTextEdit::initMsgHeaderLayout(msg_type msg_type_mode) void ctaiHistoryTextEdit::initMsgHeaderLayout()
{ {
// 消息头左区域布局,ico,id,fp,time // 消息头左区域布局,ico,id,fp,time
header_info_layout = new QHBoxLayout(); header_info_layout = new QHBoxLayout();
@ -71,7 +81,7 @@ void ctaiHistoryTextEdit::initMsgHeaderLayout(msg_type msg_type_mode)
m_restart_to_send->setObjectName("m_restart_to_send"); m_restart_to_send->setObjectName("m_restart_to_send");
m_msg_fold->setIcon(QIcon(":res/img/btn/btn_info_up.png")); m_msg_fold->setIcon(QIcon(":res/img/btn/btn_info_up.png"));
m_msg_fold->setIconSize(QSize(25, 25)); m_msg_fold->setIconSize(QSize(25, 25));
if (msg_type_mode == SYSTEM) if (m_msg_type == SYSTEM)
{ {
// 1.SYSTEM消息头水平左信息区 // 1.SYSTEM消息头水平左信息区
m_msg_system_header_ico = new QPushButton(); m_msg_system_header_ico = new QPushButton();
@ -109,12 +119,15 @@ void ctaiHistoryTextEdit::initMsgHeaderLayout(msg_type msg_type_mode)
} }
} }
void ctaiHistoryTextEdit::set_default_opts() void ctaiHistoryTextEdit::set_default_opts()
{
if (m_msg_type == USER)
{ {
m_msg_history->setFont(QFont(m_msg_tools->getFont(), m_msg_tools->getFontSize().toInt())); m_msg_history->setFont(QFont(m_msg_tools->getFont(), m_msg_tools->getFontSize().toInt()));
} }
void ctaiHistoryTextEdit::connect_signals(msg_type msg_type_mode) }
void ctaiHistoryTextEdit::connect_signals()
{ {
if (msg_type_mode == SYSTEM) if (m_msg_type == SYSTEM)
{ {
// 复制功能 // 复制功能
connect(m_msg_tools, SIGNAL(signalsOnCopy()), this, SLOT(slotsOnCopy())); connect(m_msg_tools, SIGNAL(signalsOnCopy()), this, SLOT(slotsOnCopy()));
@ -131,12 +144,15 @@ void ctaiHistoryTextEdit::connect_signals(msg_type msg_type_mode)
// 其他功能菜单 // 其他功能菜单
connect(m_msg_tools, SIGNAL(signalsOnOptsMenu()), this, SLOT(slotsOnOptsMenu())); connect(m_msg_tools, SIGNAL(signalsOnOptsMenu()), this, SLOT(slotsOnOptsMenu()));
} }
else
{
connect(m_msg_history, SIGNAL(textChanged()), this, SLOT(slotsOnSyncHeight()));
}
// 删除信息 // 删除信息
connect(m_msg_delete, SIGNAL(clicked()), this, SLOT(slotsOnDelete())); connect(m_msg_delete, SIGNAL(clicked()), this, SLOT(slotsOnDelete()));
// 折叠信息功能 // 折叠信息功能
connect(m_msg_fold, SIGNAL(clicked()), this, SLOT(slotsOnFold())); connect(m_msg_fold, SIGNAL(clicked()), this, SLOT(slotsOnFold()));
// 同步行高 // 同步行高
connect(m_msg_history, SIGNAL(textChanged()), this, SLOT(slotsOnSyncHeight()));
// 插入msg到send // 插入msg到send
connect(m_history_to_send, SIGNAL(clicked()), this, SLOT(slotsHisResToSend())); connect(m_history_to_send, SIGNAL(clicked()), this, SLOT(slotsHisResToSend()));
// 重试send // 重试send
@ -163,9 +179,12 @@ void ctaiHistoryTextEdit::slotsOnOptsMenu()
{ {
} }
void ctaiHistoryTextEdit::slotsOnDisplayFontSize() void ctaiHistoryTextEdit::slotsOnDisplayFontSize()
{
if (m_msg_type == USER)
{ {
m_msg_history->setFont(QFont(m_msg_tools->getFont(), m_msg_tools->getFontSize().toInt())); m_msg_history->setFont(QFont(m_msg_tools->getFont(), m_msg_tools->getFontSize().toInt()));
} }
}
void ctaiHistoryTextEdit::slotsOnDelete() void ctaiHistoryTextEdit::slotsOnDelete()
{ {
// 发送删除请求信号 // 发送删除请求信号
@ -174,10 +193,13 @@ void ctaiHistoryTextEdit::slotsOnDelete()
void ctaiHistoryTextEdit::slotsOnCopy() void ctaiHistoryTextEdit::slotsOnCopy()
{ {
// 获取文本并复制到剪贴板 // 获取文本并复制到剪贴板
if (m_msg_type == USER)
{
QString text = m_msg_history->toPlainText(); QString text = m_msg_history->toPlainText();
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(text); clipboard->setText(text);
} }
}
void ctaiHistoryTextEdit::slotsOnSave(QString save_path, int index) void ctaiHistoryTextEdit::slotsOnSave(QString save_path, int index)
{ {
QString temp_current_content; QString temp_current_content;
@ -216,7 +238,9 @@ void ctaiHistoryTextEdit::slotsOnSave(QString save_path, int index)
void ctaiHistoryTextEdit::slotsOnFold() void ctaiHistoryTextEdit::slotsOnFold()
{ {
m_is_folded = !m_is_folded; m_is_folded = !m_is_folded;
if(m_msg_type==USER){
m_msg_history->setFixedHeight(m_is_folded ? 0 : m_original_height); m_msg_history->setFixedHeight(m_is_folded ? 0 : m_original_height);
}
m_msg_fold->setIcon(QIcon(m_is_folded ? ":res/img/btn/btn_info_down.png" : ":res/img/btn/btn_info_up.png")); m_msg_fold->setIcon(QIcon(m_is_folded ? ":res/img/btn/btn_info_down.png" : ":res/img/btn/btn_info_up.png"));
updateGeometry(); updateGeometry();
emit signalsRowHeightChanged(m_is_folded); emit signalsRowHeightChanged(m_is_folded);
@ -281,6 +305,8 @@ void ctaiHistoryTextEdit::slotsOnSyncHeight()
{ {
return; return;
} }
if (m_msg_type == USER)
{
// 直接使用documentLayout获取高度避免多次计算 // 直接使用documentLayout获取高度避免多次计算
int textHeight = m_msg_history->document()->documentLayout()->documentSize().height(); int textHeight = m_msg_history->document()->documentLayout()->documentSize().height();
if (textHeight > 0) if (textHeight > 0)
@ -312,6 +338,8 @@ void ctaiHistoryTextEdit::slotsOnSyncHeight()
} }
} }
} }
}
// 设置下一次检查的延迟 // 设置下一次检查的延迟
debounceTimer.start(100); debounceTimer.start(100);
} }
@ -330,6 +358,7 @@ void ctaiHistoryTextEdit::addSystemMessage(const model_data &message)
{ {
// 流式模式下追加内容 // 流式模式下追加内容
m_current_content += message.postback_model_data; m_current_content += message.postback_model_data;
m_edit_cef->onCallJsCode(QSL(message.postback_model_data));
} }
else else
{ {
@ -337,7 +366,7 @@ void ctaiHistoryTextEdit::addSystemMessage(const model_data &message)
m_current_content = QSL(message.postback_model_data); m_current_content = QSL(message.postback_model_data);
} }
m_msg_history->setMarkdown(m_current_content); // m_msg_history->setMarkdown(m_current_content);
} }
// 增加tokens信息 // 增加tokens信息
void ctaiHistoryTextEdit::updateTokensMessage(const model_data &message) void ctaiHistoryTextEdit::updateTokensMessage(const model_data &message)

View File

@ -37,6 +37,7 @@
#include "ctai_base.h" #include "ctai_base.h"
#include "ctaiMathConvert.h" #include "ctaiMathConvert.h"
#include "ctaiHistoryTools.h" #include "ctaiHistoryTools.h"
#include "QCefWidget/CefWidget.h"
std::mutex m_mutex; std::mutex m_mutex;
class ctaiHistoryTextEdit : public QWidget class ctaiHistoryTextEdit : public QWidget
{ {
@ -45,8 +46,8 @@ public:
ctaiHistoryTextEdit(QWidget *parent = nullptr); ctaiHistoryTextEdit(QWidget *parent = nullptr);
~ctaiHistoryTextEdit(); ~ctaiHistoryTextEdit();
void initLayout(msg_type msg_type_mode); void initLayout(msg_type msg_type_mode);
void initMsgHeaderLayout(msg_type msg_type_mode); void initMsgHeaderLayout();
void initMsgHistoryLayout(msg_type msg_type_mode); void initMsgHistoryLayout();
void initMsgLine(); void initMsgLine();
void addUserMessage(const model_data &message); void addUserMessage(const model_data &message);
void addSystemMessage(const model_data &message); void addSystemMessage(const model_data &message);
@ -69,10 +70,11 @@ signals:
void signalsRowHeightChanged(bool); void signalsRowHeightChanged(bool);
void signalsEditHisResToSend(QString,HISTORY_SEND_MODE); void signalsEditHisResToSend(QString,HISTORY_SEND_MODE);
private: private:
void connect_signals(msg_type msg_type_mode); // 连接信号和槽 void connect_signals(); // 连接信号和槽
void set_default_opts(); void set_default_opts();
private: private:
ctaiMathConvert *m_math_convert; ctaiMathConvert *m_math_convert;
CefWidget *m_edit_cef;
QFrame *msg_line; QFrame *msg_line;
QSpacerItem *sparcer_item = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed); QSpacerItem *sparcer_item = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
QVBoxLayout *main_layout = {}; QVBoxLayout *main_layout = {};
@ -111,6 +113,8 @@ private:
QString m_msg_sned_id = {}; QString m_msg_sned_id = {};
// 本次信息 // 本次信息
QString m_current_content; QString m_current_content;
//任务类型
msg_type m_msg_type;
//粗体字 //粗体字
bool m_bold=false; bool m_bold=false;
std::vector<QString> save_extend={".txt",".html",".md",".pdf"}; std::vector<QString> save_extend={".txt",".html",".md",".pdf"};

View File

@ -11,34 +11,38 @@
#define DEBUG_PRINT true #define DEBUG_PRINT true
void debug_print_argv(int argc, char *argv[]) void debug_print_argv(int argc, char *argv[])
{ {
if(!argc){ if (!argc)
{
return; return;
} }
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
DWORD process_id = GetCurrentProcessId(); DWORD process_id = GetCurrentProcessId();
std::cout << "Process ID:"<<process_id<<" Argvs"<<std::endl; std::cout << "CurrentProcessId Argvs" << std::endl;
for (int i = 0; i < argc; ++i) for (int i = 0; i < argc; ++i)
{ {
std::cout << "Process ID:" << process_id << " Argv:" << i << ": " << argv[i] << std::endl; std::cout << "Process ID:" << process_id << " Argv:" << i << ": " << argv[i] << std::endl;
} }
} }
QString curExeDir(){ QString curExeDir()
{
return QDir::currentPath(); return QDir::currentPath();
} }
void exsMkDir(QString Dir){ void exsMkDir(QString Dir)
if(!QDir(Dir).exists()){ {
if (!QDir(Dir).exists())
{
QDir().mkdir(Dir); QDir().mkdir(Dir);
} }
} }
bool exeCinfog(int argc,char *argv[]){ bool exeCinfog(int argc, char *argv[])
if(argc<=0){ {
return true;
}
std::string ex_1 = "renderer"; std::string ex_1 = "renderer";
std::string ex_2 = "utility"; std::string ex_2 = "utility";
for (int i = 0; i < argc; ++i){ for (int i = 0; i < argc; i++)
{
std::string arg = argv[i]; std::string arg = argv[i];
if (arg.find(ex_1) == std::string::npos||arg.find(ex_2)== std::string::npos){ if (arg.find(ex_1) == std::string::npos || arg.find(ex_2) == std::string::npos)
{
return true; return true;
} }
} }
@ -51,7 +55,8 @@ void initConfig(int argc,char *argv[],QCefConfig &config,QString currentDir)
exsMkDir(currentDir + "/user/userCache"); exsMkDir(currentDir + "/user/userCache");
// 子进程路径和名字,可以利用本进程复用, // 子进程路径和名字,可以利用本进程复用,
// Mingw编译下多进程情况需要设置否则程序会退出因为无法拉起子进程 // Mingw编译下多进程情况需要设置否则程序会退出因为无法拉起子进程
if(exeCinfog(argc,argv)){ if (exeCinfog(argc, argv))
{
config.setBrowserSubProcessPath(currentDir + "/ctai.exe"); config.setBrowserSubProcessPath(currentDir + "/ctai.exe");
} }
config.setRootCachePath(currentDir + "/user"); config.setRootCachePath(currentDir + "/user");
@ -67,7 +72,7 @@ void initConfig(int argc,char *argv[],QCefConfig &config,QString currentDir)
// 内置的协议方案名称 // 内置的协议方案名称
config.setBuiltinSchemeName("Ctai"); config.setBuiltinSchemeName("Ctai");
// 无窗口渲染模式 // 无窗口渲染模式
config.setWindowlessRenderingEnabled(true); // config.setWindowlessRenderingEnabled(true);
// 远程Debug端口 // 远程Debug端口
// config.setRemoteDebuggingPort(9000); // config.setRemoteDebuggingPort(9000);
// 请求头的语言 // 请求头的语言
@ -85,7 +90,7 @@ void initConfig(int argc,char *argv[],QCefConfig &config,QString currentDir)
// 在进程中使用GPU渲染-开启后只有一个进程 // 在进程中使用GPU渲染-开启后只有一个进程
config.addCommandLineSwitch("in-process-gpu"); config.addCommandLineSwitch("in-process-gpu");
// 无头模式 // 无头模式
config.addCommandLineSwitch("headless"); // config.addCommandLineSwitch("headless");
// 密钥链 // 密钥链
config.addCommandLineSwitch("use-mock-keychain"); config.addCommandLineSwitch("use-mock-keychain");
// chrome运行时环境 // chrome运行时环境
@ -93,7 +98,7 @@ void initConfig(int argc,char *argv[],QCefConfig &config,QString currentDir)
// Alloy 风格 // Alloy 风格
config.addCommandLineSwitch("use-alloy-style"); config.addCommandLineSwitch("use-alloy-style");
// 离屏渲染 // 离屏渲染
config.addCommandLineSwitch("off-screen-rendering-enabled"); // config.addCommandLineSwitch("off-screen-rendering-enabled");
// 网络服务In进程 // 网络服务In进程
config.addCommandLineSwitchWithValue("enable-features", "NetworkServiceInProcess"); config.addCommandLineSwitchWithValue("enable-features", "NetworkServiceInProcess");
// 语言 // 语言
@ -121,28 +126,27 @@ int main(int argc, char *argv[])
initConfig(argc, argv, config, curExeDir()); initConfig(argc, argv, config, curExeDir());
// 初始化浏览器上下文 // 初始化浏览器上下文
QCefContext cefContext(&a, argc, argv, &config); QCefContext cefContext(&a, argc, argv, &config);
//初始化浏览器
CefWidget cw; CefWidget cw;
cw.show(); cw.show();
// qputenv("QT_QPA_PLATFORM", "windows:fontengine=freetype"); qputenv("QT_QPA_PLATFORM", "windows:fontengine=freetype");
// // 加载语言包 // 加载语言包
// QTranslator qtBaseTranslator; QTranslator qtBaseTranslator;
// if (!qtBaseTranslator.load(QStringLiteral(":/res/translator/qtbase_zh_CN.qm"))) if (!qtBaseTranslator.load(QStringLiteral(":/res/translator/qtbase_zh_CN.qm")))
// { {
// // 处理加载翻译文件失败的情况 // 处理加载翻译文件失败的情况
// qDebug() << "Failed to load translation file."; qDebug() << "Failed to load translation file.";
// return -1; return -1;
// } }
// a.installTranslator(&qtBaseTranslator); a.installTranslator(&qtBaseTranslator);
// // 读取窗体的配置并初始化 // 读取窗体的配置并初始化
// sui_init_config(); sui_init_config();
// ctai x; ctai x;
// x.init_layout(); x.init_layout();
// // 仅限于windows平台 // 仅限于windows平台
// #if defined(__WIN32__) #if defined(__WIN32__)
// x.title()->set_type(QD_TYPE::QD_EXIT); x.title()->set_type(QD_TYPE::QD_EXIT);
// #endif #endif
// x.show(); x.show();
a.exec(); a.exec();
qDebug() << "EXIT"; qDebug() << "EXIT";
return 0; return 0;