lennlouis 3 週間 前
コミット
694f182918

BIN
appicon.ico


+ 31 - 32
core_form/frmalbum/frmalbum.cpp

@@ -26,33 +26,38 @@ int FrmAlbum::getCopyType()
 
 void FrmAlbum::slot_updateImage()
 {
-
-    qDebug() <<"slot_updateImage";
-    // QList<QUrl> urls = ImageManager::instance()->getImageUrls(FileConfigDecode::getInstance()->getAddress(),
-    //                                                           FileConfigDecode::getInstance()->getUserName());
-
-    // foreach (const QUrl& u, urls) {
-    //     qDebug() << "image url:" <<u;
-    //     FrmImgShow* widget  = new FrmImgShow;
-    //     connect(widget, &FrmImgShow::signal_imageSelected, [this](const QString& url){
-    //         m_selectedImageSet.insert(url);
-    //     });
-    //     connect(widget, &FrmImgShow::signal_imageUnselected, [this](const QString& url){
-    //         m_selectedImageSet.remove(url);
-    //     });
-    //     widget->loadImage(u);
-    //     picWidgetList.push_front(widget);
-    //     panelWidget->setWidget(picWidgetList, 3);
-    // }
+    picWidgetList.clear();
+    panelWidget->clearWidgets();
+    QList<QUrl> urls = ImageManager::instance()->getImageUrls(FileConfigDecode::getInstance()->getAddress(),
+                                                              FileConfigDecode::getInstance()->getUserName());
+    qDebug() <<urls.size();
+    foreach (const QUrl& u, urls) {
+        FrmImgShow* widget  = new FrmImgShow(this);
+        connect(widget, &FrmImgShow::signal_imageSelected, [this](const QString& url){
+            m_selectedImageSet.insert(url);
+        });
+        connect(widget, &FrmImgShow::signal_imageUnselected, [this](const QString& url){
+            m_selectedImageSet.remove(url);
+        });
+
+        connect(widget, &FrmImgShow::signal_imageDelete, this, &FrmAlbum::slot_updateImage);
+
+        widget->loadImage(u);
+        picWidgetList.push_back(widget);
+
+        // panelWidget->setWidget(picWidgetList, 3);
+    }
+    panelWidget->setWidget(picWidgetList, 4);
+    panelWidget->setSpace(15);
 
 }
 
 void FrmAlbum::initForm()
 {
 
-    layout = new QVBoxLayout();
+    layout = new QVBoxLayout(this);
     setLayout(layout);
-    panelWidget = new PanelWidget();
+    panelWidget = new PanelWidget(this);
     panelWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     panelWidget->setStyleSheet("border:1px solid white;");
     panelWidget->setSpace(5);
@@ -75,7 +80,6 @@ void FrmAlbum::initForm()
     btnCopy->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
     btnCopy->setStyleSheet("height:25px;width:70px;background-color:#1B9EF3;color:white;border-style:none;border-radius:8px");
     connect(btnCopy, &QPushButton::clicked, [this](){
-        qDebug() <<"btnCopy";
         QString clipStr = "";
         foreach (QString s, m_selectedImageSet) {
             switch (cbbCopyType->currentIndex()) {
@@ -136,7 +140,6 @@ void FrmAlbum::initForm()
 
     connect(cbbCopyType, &QComboBox::currentIndexChanged, [this](int index){
         m_copyType = index;
-        qDebug() << m_copyType;
     });
 
     spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Fixed);
@@ -155,13 +158,12 @@ void FrmAlbum::initForm()
     // qDebug() << ui->widget;
 
     connect(TCHttpService::getInstance(), &TCHttpService::signal_loginSuc, [this](){
-        qDebug() <<"login success";
+        // qDebug() <<"login success";
         QList<QUrl> urls = ImageManager::instance()->getImageUrls(FileConfigDecode::getInstance()->getAddress(),
                                                                   FileConfigDecode::getInstance()->getUserName());
 
         foreach (const QUrl& u, urls) {
-            qDebug() << "image url:" <<u;
-            FrmImgShow* widget  = new FrmImgShow(panelWidget);
+            FrmImgShow* widget  = new FrmImgShow(this);
             connect(widget, &FrmImgShow::signal_imageSelected, [this](const QString& url){
                 m_selectedImageSet.insert(url);
             });
@@ -170,13 +172,10 @@ void FrmAlbum::initForm()
             });
             widget->loadImage(u);
             picWidgetList.push_front(widget);
-            panelWidget->setWidget(picWidgetList, 3);
+
+            // panelWidget->setWidget(picWidgetList, 3);
         }
+        panelWidget->setWidget(picWidgetList, 4);
+        panelWidget->setSpace(15);
     });
-
-
-
-
-    panelWidget->setWidget(picWidgetList, 4);
-    panelWidget->setSpace(15);
 }

+ 3 - 2
core_form/frmalbum/frmalbum.h

@@ -6,9 +6,10 @@
 #include <QComboBox>
 #include <QSet>
 #include "panelwidget.h"
-#include "frmimgshow.h"
-#include "fileconfigdecode.h"`
 #include <QHBoxLayout>
+#include "frmimgshow.h"
+#include "fileconfigdecode.h"
+
 
 namespace Ui {
 class FrmAlbum;

+ 13 - 12
core_form/frmimgshow/frmimgshow.cpp

@@ -8,14 +8,12 @@ FrmImgShow::FrmImgShow(QWidget *parent) : QWidget(parent)
     connect(TCHttpService::getInstance(), &TCHttpService::signal_imageDownloaded,
             this, [this](const QString& requestId, const QPixmap& pixmap){
         if (requestId == m_requestId) {
-            // setLoadingState(false);
-            qDebug() << "load success";
             setImage(pixmap);
         }
     });
 
     connect(TCHttpService::getInstance(), &TCHttpService::signal_downloadFailed,
-            this, [this](const QString& requestId, const QString& error){
+            this, [this](const QString& requestId){
         if (requestId == m_requestId) {
             qDebug() << "load failed";
         }
@@ -24,7 +22,6 @@ FrmImgShow::FrmImgShow(QWidget *parent) : QWidget(parent)
 
 void FrmImgShow::loadImage(const QUrl &imageUrl)
 {
-    qDebug() << "loadImage";
     m_currentUrl = imageUrl;
     m_requestId = QUuid::createUuid().toString();
     TCHttpService::getInstance()->downloadImage(m_requestId, imageUrl);
@@ -46,14 +43,9 @@ void FrmImgShow::setImage(const QPixmap &pixmap)
     labImg->setPixmap(pixmap.scaled(this->labImg->width(), this->labImg->height()));
 }
 
-void FrmImgShow::setLoadingState(bool loading)
-{
-
-}
-
 void FrmImgShow::initSignalSlot()
 {
-    connect(btnCopy, &QPushButton::clicked, [this](){
+    connect(btnCopy, &QPushButton::clicked, this, [this](){
         switch(FrmAlbum::getCopyType()) {
             case 0:
             {
@@ -86,7 +78,7 @@ void FrmImgShow::initSignalSlot()
         }
     });
 
-    connect(ckbSelect, &QCheckBox::checkStateChanged, [this](Qt::CheckState state){
+    connect(ckbSelect, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state){
         if (state == Qt::Unchecked) {
             emit signal_imageUnselected(m_currentUrl.toString());
         }
@@ -95,6 +87,15 @@ void FrmImgShow::initSignalSlot()
             emit signal_imageSelected(m_currentUrl.toString());
         }
     });
+
+    connect(btnDelete, &QPushButton::clicked, this, [this](){
+        // qDebug() <<"delete";
+        QString domain = FileConfigDecode::getInstance()->getAddress();
+        QString userName = FileConfigDecode::getInstance()->getUserName();
+        int del_res = ImageManager::instance()->removeImageUrl(domain, userName, m_currentUrl.toString());
+        // qDebug() << "del_res:" << del_res;
+        emit signal_imageDelete();
+    });
 }
 
 
@@ -199,7 +200,7 @@ void FrmImgShow::initForm()
     // btnCopy->setFixedSize(32, 32);
     // btnCopy->setCursor(Qt::PointingHandCursor);
 
-    setStyleSheet("background-color: #FF0000");
+    // setStyleSheet("background-color: #FF0000");
 
     setFixedSize(134, 160);
 

+ 1 - 1
core_form/frmimgshow/frmimgshow.h

@@ -23,7 +23,6 @@ public:
 
     void loadImage(const QUrl& imageUrl);
     void setImage(const QPixmap& pixmap);
-    void setLoadingState(bool loading);
 
     void initSignalSlot();
 
@@ -56,6 +55,7 @@ private:
 signals:
     void signal_imageSelected(QString);
     void signal_imageUnselected(QString);
+    void signal_imageDelete();
 };
 
 #endif // FRMIMGSHOW_H

+ 2 - 2
core_form/frmsetting/frmsetting.cpp

@@ -94,14 +94,14 @@ void FrmSetting::initWidget()
     }
     if (FileConfigDecode::getInstance()->getAutoLogin()) {
         ui->labAUtoLoginOpen->setStyleSheet(OPENQSS);
-        ui->labAUtoLoginOpen->setStyleSheet(CLOSEQSS);
+        ui->labAutoLoginClose->setStyleSheet(CLOSEQSS);
         TCHttpService::getInstance()->setConfiguration(FileConfigDecode::getInstance()->getUserName(),
                                                        FileConfigDecode::getInstance()->getPassword(),
                                                        FileConfigDecode::getInstance()->getAddress());
     }
     else {
         ui->labAUtoLoginOpen->setStyleSheet(CLOSEQSS);
-        ui->labAUtoLoginOpen->setStyleSheet(OPENQSS);
+        ui->labAutoLoginClose->setStyleSheet(OPENQSS);
     }
 
     ui->schRename->setChecked(FileConfigDecode::getInstance()->getRename());

+ 8 - 1
core_form/panelwidget/panelwidget.cpp

@@ -81,6 +81,14 @@ int PanelWidget::getColumnCount()
     return this->columnCount;
 }
 
+void PanelWidget::clearWidgets()
+{
+    foreach (QWidget* w, widgets) {
+        delete w;
+    }
+    widgets.clear();
+}
+
 void PanelWidget::setWidget(QList<QWidget *> widgets, int columnCount)
 {
     this->widgets = widgets;
@@ -94,7 +102,6 @@ void PanelWidget::setWidget(QList<QWidget *> widgets, int columnCount)
     foreach (QWidget *widget, widgets) {
         gridLayout->removeWidget(widget);
         widget->setVisible(false);
-        delete widget;
     }
 
     //重新添加到布局中并可见

+ 2 - 0
core_form/panelwidget/panelwidget.h

@@ -60,6 +60,7 @@ public:
 
     QList<QWidget *> getWidgets();
     int getColumnCount();
+    void clearWidgets();
 
 
 public Q_SLOTS:
@@ -70,6 +71,7 @@ public Q_SLOTS:
     void setAutoWidth(bool autoWidth);
     void setAutoHeight(bool autoHeight);
 
+
 };
 
 #endif // PANELWIDGET_H

+ 40 - 24
core_support/tchttpservice/tchttpservice.cpp

@@ -156,28 +156,6 @@ void TCHttpService::apiUpload(const QString &filePath)
     });
 }
 
-void TCHttpService::apiSharePicShare(const QString &fileName, const QString &md5)
-{
-
-    QString urlStr;
-    if (m_enableSsl)
-        urlStr = "https://" + m_domain + "/api/sharepic";
-    else
-        urlStr = "http://" + m_domain + "/api/sharepic";
-
-    QMap<QString, QString> headers;
-    QMap<QString, QString> body;
-    QMap<QString, QString> params;
-
-    headers.insert("Content-Type", "application/json");
-
-    QString bodyStr = QString("\"%1\":\"%2\",\"%3\":\"%4\",\"%5\":\"%6\",\"%7\":\"%8\"").arg("token").arg(m_token).
-            arg("user").arg(m_userName).arg("md5").arg(md5).arg("filename").arg(fileName);
-
-    params.insert("cmd", "share");
-
-}
-
 void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString domain)
 {
     this->m_domain = domain;
@@ -203,9 +181,11 @@ void TCHttpService::setUploadNum(int nb)
 
 void TCHttpService::downloadImage(const QString &requestId, const QUrl &imageUrl)
 {
-#if 0
+#if 1
     QPixmap cachedPixmap;
     if (QPixmapCache::find(imageUrl.toString(), &cachedPixmap)) {
+
+
         emit signal_imageDownloaded(requestId, cachedPixmap);
         return;
     }
@@ -217,7 +197,9 @@ void TCHttpService::downloadImage(const QString &requestId, const QUrl &imageUrl
     }
 #endif
     QNetworkRequest request(imageUrl);
+    request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
     QNetworkReply* reply = m_manager.get(request);
+    m_pendingRequests[reply] = requestId;
 
     connect(reply, &QNetworkReply::finished, [this, reply](){
 
@@ -229,6 +211,7 @@ void TCHttpService::downloadImage(const QString &requestId, const QUrl &imageUrl
         else {
             QPixmap pixmap;
             if (pixmap.loadFromData(reply->readAll())) {
+                cacheImage(reply->url(), pixmap);
                 emit signal_imageDownloaded(requestId, pixmap);
             }
             else {
@@ -236,9 +219,31 @@ void TCHttpService::downloadImage(const QString &requestId, const QUrl &imageUrl
             }
         }
 
+
         reply->deleteLater();
     });
-    m_pendingRequests[reply] = requestId;
+    // connect(reply, &QNetworkReply::finished, [this, reply, imageUrl](){
+
+    //     QString requestId = m_pendingRequests.take(reply);
+
+    //     if (reply->error() != QNetworkReply::NoError) {
+    //         emit signal_downloadFailed(requestId, reply->errorString());
+    //     }
+    //     else {
+    //         QPixmap pixmap;
+    //         if (pixmap.loadFromData(reply->readAll())) {
+    //             QPixmapCache::insert(imageUrl.toString(), pixmap);
+    //             emit signal_imageDownloaded(requestId, pixmap);
+    //         }
+    //         else {
+    //             emit signal_downloadFailed(requestId, "Failed to load image data");
+    //         }
+    //     }
+
+    //     reply->deleteLater();
+    // });
+    // connect(reply, &QNetworkReply::finished, this, &TCHttpService::slot_downloadFinished);
+
 }
 
 QUrl TCHttpService::encodeUrl(QString urlStr, QMap<QString, QString> params)
@@ -314,6 +319,16 @@ QString TCHttpService::getCacheFilePath(const QUrl &imageUrl)
     return QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/" + fileName;
 }
 
+void TCHttpService::cacheImage(const QUrl &imageUrl, const QPixmap &pixmap)
+{
+    QPixmapCache::insert(imageUrl.toString(), pixmap);
+
+    QString filePath = getCacheFilePath(imageUrl);
+    pixmap.save(filePath, "PNG");
+
+    cleanOldCacheFiles();
+}
+
 TCHttpService::TCHttpService(QObject *parent) : QObject(parent)
 {
 
@@ -329,6 +344,7 @@ void TCHttpService::slot_downloadFinished(QNetworkReply *reply)
     else {
         QPixmap pixmap;
         if (pixmap.loadFromData(reply->readAll())) {
+            cacheImage(reply->url(), pixmap);
             emit signal_imageDownloaded(requestId, pixmap);
         }
         else {

+ 1 - 1
core_support/tchttpservice/tchttpservice.h

@@ -41,7 +41,6 @@ public:
     void apiMd5(const QString& filePath);
 #endif
     void apiUpload(const QString& filePath);
-    void apiSharePicShare(const QString& fileName, const QString& md5);
     void setConfiguration(QString userName, QString firstPwd, QString domain);
     void setSsl(bool enable);
     bool getOnlineState();
@@ -55,6 +54,7 @@ private:
     void cleanOldCacheFiles();
     bool getCachedImage(const QUrl& imageUrl, QPixmap& pixmap);
     QString getCacheFilePath(const QUrl& imageUrl);
+    void cacheImage(const QUrl& imageUrl, const QPixmap& pixmap);
 
 signals:
     void signal_loginSuc();

+ 28 - 1
core_support/urldatabase/urldatabase.cpp

@@ -1,4 +1,4 @@
-#include "urldatabase.h".h"
+#include "urldatabase.h"
 #include <QSqlQuery>
 #include <QSqlError>
 #include <QDebug>
@@ -171,6 +171,33 @@ bool ImageManager::addImageUrl(const QString &domain, const QString &user, const
     return query.exec();
 }
 
+bool ImageManager::removeImageUrl(const QString &domain, const QString &user, const QUrl &imageUrl)
+{
+    int domainId = getDomainId(domain);
+    int userId = getUserId(user);
+
+    if (domainId == -1 || userId == -1) {
+        return false;
+    }
+
+    QSqlQuery query(m_db);
+    query.prepare("SELECT id FROM domain_users WHERE domain_id = ? AND user_id = ?");
+    query.addBindValue(domainId);
+    query.addBindValue(userId);
+
+    if (!query.exec() || !query.next()) {
+        return false;
+    }
+
+    int domainUserId = query.value(0).toInt();
+    query.prepare("DELETE FROM image_urls WHERE domain_user_id = ? AND image_url = ?");
+    query.addBindValue(domainUserId);
+    query.addBindValue(imageUrl.toString());
+
+
+    return query.exec();
+}
+
 QList<QUrl> ImageManager::getImageUrls(const QString &domain, const QString &user)
 {
     QList<QUrl> urls;

+ 3 - 0
core_support/urldatabase/urldatabase.h

@@ -30,9 +30,12 @@ public:
     // 添加域名-用户对(不重复)
     bool addDomainUser(const QString &domain, const QString &user);
 
+    // bool deleteDomainUser(const QString& domain, const QString& user);
+
     // 上传成功后添加图片URL
     bool addImageUrl(const QString &domain, const QString &user, const QUrl &imageUrl);
 
+    bool removeImageUrl(const QString& domain, const QString& user, const QUrl& imageUrl);
     // 获取特定域名-用户的所有图片URL
     QList<QUrl> getImageUrls(const QString &domain, const QString &user);
 

+ 57 - 0
innoSetup/打包脚本.iss

@@ -0,0 +1,57 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+#define MyAppName "PicPanel"
+#define MyAppVersion "2.0"
+#define MyAppPublisher "Lenn"
+#define MyAppURL "https://huangyanjie.com"
+#define MyAppExeName "picpanel.exe"
+
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
+; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
+AppId={{13350D01-8FED-4820-B13F-20F5591D31F7}
+AppName={#MyAppName}
+AppVersion={#MyAppVersion}
+;AppVerName={#MyAppName} {#MyAppVersion}
+AppPublisher={#MyAppPublisher}
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+DefaultDirName={autopf}\{#MyAppName}
+UninstallDisplayIcon={app}\{#MyAppExeName}
+; "ArchitecturesAllowed=x64compatible" specifies that Setup cannot run
+; on anything but x64 and Windows 11 on Arm.
+ArchitecturesAllowed=x64compatible
+; "ArchitecturesInstallIn64BitMode=x64compatible" requests that the
+; install be done in "64-bit mode" on x64 or Windows 11 on Arm,
+; meaning it should use the native 64-bit Program Files directory and
+; the 64-bit view of the registry.
+ArchitecturesInstallIn64BitMode=x64compatible
+DisableProgramGroupPage=yes
+; Uncomment the following line to run in non administrative install mode (install for current user only).
+;PrivilegesRequired=lowest
+OutputDir=C:\Users\Lenn Louis\Desktop
+OutputBaseFilename=PicPanel-2.0-x64
+SetupIconFile=C:\Users\Lenn Louis\Desktop\appicon.ico
+SolidCompression=yes
+WizardStyle=modern
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+
+[Tasks]
+Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
+
+[Files]
+Source: "C:\Users\Lenn Louis\Desktop\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
+Source: "C:\Users\Lenn Louis\Downloads\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Release\release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
+; NOTE: Don't use "Flags: ignoreversion" on any shared system files
+
+[Icons]
+Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
+Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
+
+[Run]
+Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
+

+ 2 - 1
picpanel.pro

@@ -22,7 +22,7 @@ INCLUDEPATH += $$PWD
 INCLUDEPATH += $$PWD/core_form
 INCLUDEPATH += $$PWD/core_ui
 INCLUDEPATH += $$PWD/core_support
-include($$PWD/core_qui/core_qui.pri)
+# include($$PWD/core_qui/core_qui.pri)
 include($$PWD/core_form/core_form.pri)
 include($$PWD/core_ui/core_ui.pri)
 include($$PWD/core_support/core_support.pri)
@@ -40,6 +40,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
 #UI_DIR = $$PWD/build/ui
 
 #DESTDIR = $$PWD/build/bin
+RC_ICONS = appicon.ico
 
 RESOURCES += \
     image.qrc \

+ 54 - 13
picpanel.pro.user

@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 14.0.2, 2025-03-26T18:36:00. -->
+<!-- Written by QtCreator 4.11.1, 2025-03-26T22:58:21. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
-  <value type="QByteArray">{631b5895-04c2-4f08-83d2-9e1277f189a1}</value>
+  <value type="QByteArray">{4f2ec396-c2e0-4f3d-a369-5968ecaf5cee}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -78,7 +78,7 @@
     <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
     <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
     <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
-    <value type="int" key="ClangTools.ParallelJobs">12</value>
+    <value type="int" key="ClangTools.ParallelJobs">16</value>
     <value type="bool" key="ClangTools.PreferConfigFile">true</value>
     <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
     <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
@@ -99,8 +99,8 @@
    <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
     <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">E:\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">E:/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\Lenn Louis\Downloads\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/Lenn Louis/Downloads/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -138,8 +138,8 @@
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">E:\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-release</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">E:/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\Lenn Louis\Downloads\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/Lenn Louis/Downloads/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-Release</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -172,12 +172,54 @@
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
     <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
     <value type="int" key="QtQuickCompiler">0</value>
    </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\Lenn Louis\Downloads\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Profile</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/Lenn Louis/Downloads/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+    <value type="int" key="SeparateDebugInfo">0</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
@@ -196,20 +238,19 @@
     <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
     <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
     <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <value type="QList&lt;int&gt;" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
     <valuelist type="QVariantList" key="CustomOutputParsers"/>
     <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
     <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:E:/picpanel/picpanel.pro</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">E:/picpanel/picpanel.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Lenn Louis/Downloads/picpanel/picpanel.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">C:/Users/Lenn Louis/Downloads/picpanel/picpanel.pro</value>
     <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
     <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">E:/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-release</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default">C:/Users/Lenn Louis/Downloads/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-Release</value>
    </valuemap>
    <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
   </valuemap>

+ 229 - 0
picpanel.pro.user.631b589

@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 14.0.2, 2025-03-26T18:36:00. -->
+<qtcreator>
+ <data>
+  <variable>EnvironmentId</variable>
+  <value type="QByteArray">{631b5895-04c2-4f08-83d2-9e1277f189a1}</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="qlonglong">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+    <value type="QString" key="language">Cpp</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+    </valuemap>
+   </valuemap>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+    <value type="QString" key="language">QmlJS</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+    </valuemap>
+   </valuemap>
+   <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+   <value type="int" key="EditorConfiguration.IndentSize">4</value>
+   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
+   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
+   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+   <value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
+   <value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
+   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
+   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
+   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+   <value type="int" key="EditorConfiguration.TabSize">8</value>
+   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+   <value type="bool" key="EditorConfiguration.UseIndenter">false</value>
+   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+   <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
+   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+   <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
+   <value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.PluginSettings</variable>
+  <valuemap type="QVariantMap">
+   <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
+    <value type="bool" key="AutoTest.Framework.Boost">true</value>
+    <value type="bool" key="AutoTest.Framework.CTest">false</value>
+    <value type="bool" key="AutoTest.Framework.Catch">true</value>
+    <value type="bool" key="AutoTest.Framework.GTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtTest">true</value>
+   </valuemap>
+   <value type="bool" key="AutoTest.ApplyFilter">false</value>
+   <valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
+   <valuelist type="QVariantList" key="AutoTest.PathFilters"/>
+   <value type="int" key="AutoTest.RunAfterBuild">0</value>
+   <value type="bool" key="AutoTest.UseGlobal">true</value>
+   <valuemap type="QVariantMap" key="ClangTools">
+    <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
+    <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
+    <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
+    <value type="int" key="ClangTools.ParallelJobs">12</value>
+    <value type="bool" key="ClangTools.PreferConfigFile">true</value>
+    <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
+    <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
+    <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
+    <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
+   </valuemap>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="DeviceType">Desktop</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.7.3 MinGW 64-bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.7.3 MinGW 64-bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.673.win64_mingw_kit</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">E:\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">E:/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">E:\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">E:/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">部署</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
+    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="QList&lt;int&gt;" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
+    <valuelist type="QVariantList" key="CustomOutputParsers"/>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
+    <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:E:/picpanel/picpanel.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">E:/picpanel/picpanel.pro</value>
+    <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default">E:/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-release</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="qlonglong">1</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">22</value>
+ </data>
+ <data>
+  <variable>Version</variable>
+  <value type="int">22</value>
+ </data>
+</qtcreator>

+ 2 - 2
widget.cpp

@@ -111,7 +111,7 @@ bool Widget::eventFilter(QObject *watched, QEvent *event)
         if (mouseEvent->type() == QEvent::MouseButtonPress) {
             if (mouseEvent->button() == Qt::LeftButton) {
                 mousePressed = true;
-                mousePoint = mouseEvent->globalPos() - this->pos();
+                mousePoint = mouseEvent->globalPosition().toPoint() - this->pos();
             }
         }
         else if (mouseEvent->type() == QEvent::MouseButtonRelease){
@@ -119,7 +119,7 @@ bool Widget::eventFilter(QObject *watched, QEvent *event)
         }
         else if (mouseEvent->type() == QEvent::MouseMove) {
             if (mousePressed) {
-                this->move(mouseEvent->globalPos() - mousePoint);
+                this->move(mouseEvent->globalPosition().toPoint() - mousePoint);
                 return true;
             }
         }

+ 2 - 2
widget.h

@@ -23,9 +23,9 @@
 #include "iconhelper.h"
 
 #define VERSION_MAJ "2"
-#define VERSION_MIN "0"
+#define VERSION_MIN "1"
 
-#define VERSION_BATE 1
+#define VERSION_BATE 0
 
 class QPushButton;