From d80db4c389b31ffd9a3ac02d02561d9f6337c11f Mon Sep 17 00:00:00 2001 From: shangxiaoyang <shangxiaoyang@kylinos.cn> Date: Sat, 20 Apr 2024 13:50:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9SDK=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=8E=A5=E5=8F=A3=E8=87=B3=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- widgets/toolbars/kpAiDrawingBar.cpp | 143 ++++++++++++++++++---------- widgets/toolbars/kpAiDrawingBar.h | 26 +++-- 2 files changed, 109 insertions(+), 60 deletions(-) diff --git a/widgets/toolbars/kpAiDrawingBar.cpp b/widgets/toolbars/kpAiDrawingBar.cpp index 27b8aac..26b36c0 100644 --- a/widgets/toolbars/kpAiDrawingBar.cpp +++ b/widgets/toolbars/kpAiDrawingBar.cpp @@ -51,7 +51,25 @@ kpAIDrawingBar::kpAIDrawingBar(QWidget *parent) loginConfigurationPage(); else */ - initUI(); + + m_AiMode = new AIModeDataThread(); + + initUI(); + + const char* json = R"( + { + "appId": "49080653", + "apiKey": "sd6XK461G446AHz43GAKMEme", + "secretKey": "dCauacFHm6CyWW5hVT3BGg7lavYxxXxB" + } + )"; + capability_settings_set_deploy_policy(CAPABILITY_VISION, PUBLIC_CLOUD); + + capability_settings_set_model(CAPABILITY_VISION,PUBLIC_CLOUD, "baidu"); + + capability_settings_set_model_config(Capability::CAPABILITY_VISION, + DeployPolicy::PUBLIC_CLOUD, + "baidu", json); setFixedWidth(250); } @@ -60,6 +78,8 @@ kpAIDrawingBar::~kpAIDrawingBar() { if (AiSettings) delete AiSettings; + if (m_AiMode) + delete m_AiMode; } /** @@ -315,6 +335,7 @@ void kpAIDrawingBar::initUI() buildButton->setFixedSize(224,36); buildButton->setStyleSheet(colorGrayButtonStyle); buildButton->setEnabled(false); + buildButtonFlag = false; /* 分页功能 */ stackedWidget = new QStackedWidget(centralWidget); @@ -393,7 +414,7 @@ void kpAIDrawingBar::initUI() connect(previousButton, &QPushButton::clicked, this, &kpAIDrawingBar::showPreviousPage); connect(nextButton, &QPushButton::clicked, this, &kpAIDrawingBar::showNextPage); connect(deleteButton, &QPushButton::clicked, this, &kpAIDrawingBar::deleteCurrentPage); - connect(&aiThread, &AIModeDataThread::finishedSignal, this, &kpAIDrawingBar::onThreadFinished); + connect(m_AiMode, &AIModeDataThread::finishedSignal, this, &kpAIDrawingBar::onThreadFinished); centralWidget->setFixedWidth(240); @@ -785,6 +806,7 @@ void kpAIDrawingBar::onGenerateButtonClicked() buildButton->setEnabled(false); buildButton->setText(i18n("In formation...")); buildButton->setStyleSheet(colorGrayButtonStyle); + buildButtonFlag = true; if(!deleteButton->isEnabled()) deleteButton->setEnabled(true); @@ -804,7 +826,7 @@ void kpAIDrawingBar::handleInputTextChanged() //考虑添加生成中判断 QString userText = static_cast<QTextEdit *>(findChild<QTextEdit *>())->toPlainText().trimmed(); bool enableButton = !userText.isEmpty(); - if (enableButton && !buildButton->isEnabled()) { + if (enableButton && !buildButton->isEnabled() && !buildButtonFlag) { qDebug()<<"buildButton set true"; buildButton->setEnabled(enableButton); buildButton->setStyleSheet(colorfulButtonStyle); @@ -815,29 +837,6 @@ void kpAIDrawingBar::handleInputTextChanged() } } -/** - * @brief AIModeDataThread::generateImageCallback - * AI生成后回调函数 - * @param imageData - * @param userData - */ -void AIModeDataThread::generateImageCallback(VisionImageData imageData, void* userData){ - - qDebug()<<"AI生成回调函数: length:"<<imageData.data_size - <<"imageIndex:"<<imageData.index - <<"imageSum"<<imageData.total - <<"imageError="<<imageData.error_code - <<"Image format:"<< imageData.format; - - AIModeDataThread *AIMode = (AIModeDataThread *)userData; - QPixmap map; - map.loadFromData(imageData.data, imageData.data_size); - - if(imageData.index == 0) - emit AIMode->finishedSignal(false, map, imageData.index, imageData.total, imageData.error_code); - emit AIMode->finishedSignal(true, map, imageData.index, imageData.total, imageData.error_code); -} - /** * @brief kpAIDrawingBar::addPageAndStoreImages * 添加AI生成后的图片及页 @@ -965,7 +964,6 @@ void kpAIDrawingBar::onThreadFinished(bool flag, QPixmap pixmap, int imageIndex, QPixmap map; if(!flag){ deleteImageGridWidget(); - aiThread.exit(); deleteButtonFlag = true; deleteButton->setEnabled(true); return; @@ -985,9 +983,71 @@ void kpAIDrawingBar::onThreadFinished(bool flag, QPixmap pixmap, int imageIndex, buildButton->setEnabled(true); buildButton->setText(i18n("Generate now")); buildButton->setStyleSheet(colorfulButtonStyle);//设置立即生成按钮为立即生成 + buildButtonFlag = false; addPageAndStoreImages(); } - aiThread.exit(); +} + + +AIModeDataThread::AIModeDataThread() +{ + +} + +AIModeDataThread::~AIModeDataThread() +{ + vision_destory_session(session); +} + +bool AIModeDataThread::setSessionStatus() +{ + if (m_sessionFlag) + return true; + + session = nullptr; + VisionResult ret = vision_create_session(&session); + if (ret != VISION_SUCCESS) { + qDebug()<<"创建失败VisionResult="<<ret + <<"ErrorMessage:"<<vision_get_last_error_message(); + sendErrorSignal(ret); + m_sessionFlag = false; + return false; + } + + VisionResult initRet = vision_init_session(session); + if (initRet != VISION_SUCCESS) { + qDebug()<<"初始化失败 VisionResult="<<initRet + <<"ErrorMessage:"<<vision_get_last_error_message(); + sendErrorSignal(initRet); + m_sessionFlag = false; + return false; + } + m_sessionFlag = true; + return true; +} + +/** + * @brief AIModeDataThread::generateImageCallback + * AI生成后回调函数 + * @param imageData + * @param userData + */ +void AIModeDataThread::generateImageCallback(VisionImageData imageData, void* userData){ + + qDebug()<<"AI生成回调函数: length:"<<imageData.data_size + <<"imageIndex:"<<imageData.index + <<"imageSum"<<imageData.total + <<"imageError="<<imageData.error_code + <<"Image format:"<< imageData.format; + + AIModeDataThread *AIMode = (AIModeDataThread *)userData; + QPixmap map; + map.loadFromData(imageData.data, imageData.data_size); + qDebug()<<"textBox ===== "<<AIMode->textBox; + if(imageData.index == 0) + emit AIMode->finishedSignal(false, map, imageData.index, imageData.total, imageData.error_code); + emit AIMode->finishedSignal(true, map, imageData.index, imageData.total, imageData.error_code); + qDebug()<<"------------------------------ generateImageCallback"; } /** @@ -997,25 +1057,6 @@ void kpAIDrawingBar::onThreadFinished(bool flag, QPixmap pixmap, int imageIndex, */ bool AIModeDataThread::someFunctionInThread() { - VisionSession session = nullptr; - VisionResult ret = vision_create_session(&session); - - - if (ret != VISION_SUCCESS) { - qDebug()<<"创建失败VisionResult="<<ret - <<"ErrorMessage:"<<vision_get_last_error_message(); - sendErrorSignal(ret); - return false; - } - - VisionResult initRet = vision_init_session(session); - if (initRet != VISION_SUCCESS) { - qDebug()<<"初始化失败 VisionResult="<<initRet - <<"ErrorMessage:"<<vision_get_last_error_message(); - sendErrorSignal(initRet); - return false; - } - int width = AIImageSize.width() * multipleNum; int height = AIImageSize.height() * multipleNum; @@ -1024,7 +1065,7 @@ bool AIModeDataThread::someFunctionInThread() vision_set_prompt2image_callback(session, generateImageCallback, this); vision_set_prompt2image_style(session, ImageStyle); - VisionResult imageRet = vision_prompt2image(session, textBox.toLocal8Bit().data()); + VisionResult imageRet = vision_prompt2image_async(session, textBox.toLocal8Bit().data()); qDebug()<<"ImageStyle == "<<ImageStyle; if (imageRet != VISION_SUCCESS) { @@ -1033,8 +1074,6 @@ bool AIModeDataThread::someFunctionInThread() sendErrorSignal(imageRet); return false; } - vision_destory_session(session); - return true; } @@ -1196,12 +1235,14 @@ void kpAIDrawingBar::deleteCurrentPage() else setEnabledDeleteButton(); } - else + else { setEnabledDeleteButton(); + } } void kpAIDrawingBar::setEnabledDeleteButton() { + qDebug()<<"currentPageIndx == "<<currentPageIndx; if(!deleteButtonFlag && currentPageIndx == stackedWidget->count() - 1){ deleteButton->setEnabled(false); } diff --git a/widgets/toolbars/kpAiDrawingBar.h b/widgets/toolbars/kpAiDrawingBar.h index 42e5636..4f89118 100644 --- a/widgets/toolbars/kpAiDrawingBar.h +++ b/widgets/toolbars/kpAiDrawingBar.h @@ -53,6 +53,7 @@ #include <QGSettings> #include <ai-base/modelconfig.h> #include <ai-base/vision.h> +#include <kylin-ai/config.h> #define LOADING_IMAGE "/usr/share/kolourpaint/pics/loading.gif" #define BG_IMAGE "/usr/share/kolourpaint/pics/bg@2x.png" @@ -68,13 +69,17 @@ * @brief The AIModeDataThread class * 线程类,用于跑AI的服务 */ -class AIModeDataThread : public QThread { +class AIModeDataThread : public QObject +{ Q_OBJECT public: - void run() override { - someFunctionInThread(); - } + AIModeDataThread(); + ~AIModeDataThread(); + + bool setSessionStatus(); + bool someFunctionInThread(); + void setAIData (QString str, QSize size, int multiple, int quantity, VisionImageStyle Style){ textBox = str; AIImageSize = size; @@ -87,7 +92,6 @@ signals: void finishedSignal(bool flag, QPixmap pixmap, int imageIndex, int imageSum, int errorCode); private: - bool someFunctionInThread(); void sendErrorSignal(int ret){ emit finishedSignal(false, QPixmap(), 0, 1, ret); for(int i = 0; i < quantityNum; i++) @@ -102,6 +106,8 @@ private: QSize AIImageSize; QString textBox; VisionImageStyle ImageStyle; + bool m_sessionFlag = false; + VisionSession session; }; /** @@ -173,9 +179,10 @@ private slots: void onStyleMoreButtonClick(); void startThread() { - // 启动线程 - aiThread.setAIData(textBox, AIImageSize, multipleNum, quantityNum, ImageStyle); - aiThread.start(); + if (m_AiMode->setSessionStatus()){ + m_AiMode->setAIData(textBox, AIImageSize, multipleNum, quantityNum, ImageStyle); + m_AiMode->someFunctionInThread(); + } } void onThreadFinished(bool flag, QPixmap pixmap, int imageIndex, int imageSum, int errorCode); @@ -205,6 +212,7 @@ private: bool styleFlag; //风格标志位,用于判断按下哪一个风格 bool deleteButtonFlag = true; + bool buildButtonFlag; QGSettings *AiSettings; //监听配置信息 QSize AIImageSize; //图片大小 @@ -240,7 +248,7 @@ private: QVector<QVector<QPixmap>> imagesVector; //生成图像数据集成 VisionImageStyle ImageStyle; //风格样式 - AIModeDataThread aiThread; //线程类 + AIModeDataThread *m_AiMode; //AI生成程序 }; #endif