5 Commits

Author SHA1 Message Date
694f182918 完成发布 2025-03-27 00:56:01 +08:00
8b8b70c671 bug/loadimage-dump 2025-03-26 18:37:05 +08:00
LION-jiejie
c69a6899cb 优化了一些 Mac 上的适配 2025-03-26 01:05:46 +08:00
94fe294aff 数据库驱动完成,预览窗口完成 2025-03-25 23:34:11 +08:00
d86f80982d 有个不必现错误,预览初步完成 2025-03-25 18:35:28 +08:00
53 changed files with 1633 additions and 1261 deletions

18
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,18 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug picpanel",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/picpanel",
"args": [],
"cwd": "${workspaceFolder}",
"environment": [],
"MIMode": "lldb"
}
]
}

BIN
appicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -7,6 +7,7 @@ INCLUDEPATH += $$PWD/frmalbum
INCLUDEPATH += $$PWD/frmimgshow
INCLUDEPATH += $$PWD/switchbutton
INCLUDEPATH += $$PWD/serversetting
INCLUDEPATH += $$PWD/panelwidget
include($$PWD/frmupload/frmupload.pri)
include($$PWD/frmsetting/frmsetting.pri)
@@ -14,3 +15,4 @@ include($$PWD/frmalbum/frmalbum.pri)
include($$PWD/frmimgshow/frmimgshow.pri)
include($$PWD/switchbutton/switchbutton.pri)
include($$PWD/serversetting/serversetting.pri)
include($$PWD/panelwidget/panelwidget.pri)

View File

@@ -1,14 +1,181 @@
#include "frmalbum.h"
#include "ui_frmalbum.h"
#include <QUrl>
FrmAlbum::FrmAlbum(QWidget *parent)
: QWidget(parent)
, ui(new Ui::FrmAlbum)
int FrmAlbum::m_copyType = 0;
FrmAlbum::FrmAlbum(QWidget *parent) : QWidget(parent)
{
ui->setupUi(this);
initForm();
}
FrmAlbum::~FrmAlbum()
{
delete ui;
}
// QSet<QString> FrmAlbum::getUrlSet()
// {
// return m_selectedImageSet;
// }
int FrmAlbum::getCopyType()
{
return m_copyType;
}
void FrmAlbum::slot_updateImage()
{
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(this);
setLayout(layout);
panelWidget = new PanelWidget(this);
panelWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
panelWidget->setStyleSheet("border:1px solid white;");
panelWidget->setSpace(5);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
panelWidget->setObjectName("widget");
panelWidget->setStyleSheet("background-color: rgb(63, 60, 55)");
// panelWidget->setStyleSheet("background-color: #FFFFFF");
panelWidget->setAutoHeight(false);
panelWidget->setAutoWidth(false);
panelWidget->setAutoHeight(false);
panelWidget->setAutoWidth(false);
btnCopy = new QPushButton;
btnCopy->setText("复制");
btnCopy->setCursor(Qt::PointingHandCursor);
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](){
QString clipStr = "";
foreach (QString s, m_selectedImageSet) {
switch (cbbCopyType->currentIndex()) {
case 0:
{
QString curStr = QString("![](%1)").arg(s);
curStr += "\n";
clipStr += curStr;
break;
}
case 1:
{
QString curStr = QString("%1").arg(s);
curStr += "\n";
clipStr += curStr;
break;
}
case 2:
{
QString curStr = QString("<img src=\"%1\"/>").arg(s);
curStr += "\n";
clipStr += curStr;
break;
}
case 3:
{
QString curStr = QString("[IMG]%1[/IMG]").arg(s);
curStr += "\n";
clipStr += curStr;
break;
}
}
}
QClipboard* clipboard = QApplication::clipboard();
clipboard->setText(clipStr);
});
btnDelete = new QPushButton;
btnDelete->setText("删除");
btnDelete->setCursor(Qt::PointingHandCursor);
btnDelete->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
btnDelete->setStyleSheet("height:25px;width:70px;background-color:#F15140;color:white;border-style:none;border-radius:8px");
btnSelectAll = new QPushButton;
btnSelectAll->setText("全选");
btnSelectAll->setCursor(Qt::PointingHandCursor);
btnSelectAll->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
btnSelectAll->setStyleSheet("height:25px;width:70px;background-color:#44B363;color:white;border-style:none;border-radius:8px");
cbbCopyType = new QComboBox;
cbbCopyType->setCursor(Qt::PointingHandCursor);
cbbCopyType->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
cbbCopyType->setStyleSheet("height:25px;width:300;background-color:white;padding-left:16px;");
QList<QString> copyTypeList{"Markdown", "URL", "HTML", "UBB"};
cbbCopyType->addItems(copyTypeList);
connect(cbbCopyType, &QComboBox::currentIndexChanged, [this](int index){
m_copyType = index;
});
spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Fixed);
menuLayout = new QHBoxLayout();
menuLayout->setContentsMargins(0, 0, 0, 0);
menuLayout->setSpacing(8);
menuLayout->addWidget(cbbCopyType);
menuLayout->addWidget(btnCopy);
menuLayout->addWidget(btnDelete);
menuLayout->addWidget(btnSelectAll);
menuLayout->addSpacerItem(spacerItem);
layout->addLayout(menuLayout);
layout->addWidget(panelWidget);
layout->setSpacing(6);
// qDebug() << ui->widget;
connect(TCHttpService::getInstance(), &TCHttpService::signal_loginSuc, [this](){
// qDebug() <<"login success";
QList<QUrl> urls = ImageManager::instance()->getImageUrls(FileConfigDecode::getInstance()->getAddress(),
FileConfigDecode::getInstance()->getUserName());
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);
});
widget->loadImage(u);
picWidgetList.push_front(widget);
// panelWidget->setWidget(picWidgetList, 3);
}
panelWidget->setWidget(picWidgetList, 4);
panelWidget->setSpace(15);
});
}

View File

@@ -2,6 +2,14 @@
#define FRMALBUM_H
#include <QWidget>
#include <QPushButton>
#include <QComboBox>
#include <QSet>
#include "panelwidget.h"
#include <QHBoxLayout>
#include "frmimgshow.h"
#include "fileconfigdecode.h"
namespace Ui {
class FrmAlbum;
@@ -15,8 +23,29 @@ public:
explicit FrmAlbum(QWidget *parent = nullptr);
~FrmAlbum();
// QSet<QString> getUrlSet();
static int getCopyType();
public slots:
void slot_updateImage();
private:
Ui::FrmAlbum *ui;
QList<QWidget*> picWidgetList;
PanelWidget* panelWidget;
QVBoxLayout* layout;
void initForm();
QPushButton* btnCopy;
QPushButton* btnDelete;
QPushButton* btnSelectAll;
QComboBox* cbbCopyType;
QHBoxLayout* menuLayout;
QSpacerItem* spacerItem;
QSet<QString> m_selectedImageSet;
static int m_copyType;
};
#endif // FRMALBUM_H

View File

@@ -6,13 +6,30 @@
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<width>632</width>
<height>414</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
<resources/>
<connections/>

View File

@@ -1,12 +1,107 @@
#include "frmimgshow.h"
#include "frmalbum.h"
FrmImgShow::FrmImgShow(QString& url, QWidget *parent) : QWidget(parent)
FrmImgShow::FrmImgShow(QWidget *parent) : QWidget(parent)
{
initForm();
initForm();
initManager();
this->url = url;
manager->get(QNetworkRequest(QUrl(url)));
initSignalSlot();
connect(TCHttpService::getInstance(), &TCHttpService::signal_imageDownloaded,
this, [this](const QString& requestId, const QPixmap& pixmap){
if (requestId == m_requestId) {
setImage(pixmap);
}
});
connect(TCHttpService::getInstance(), &TCHttpService::signal_downloadFailed,
this, [this](const QString& requestId){
if (requestId == m_requestId) {
qDebug() << "load failed";
}
});
}
void FrmImgShow::loadImage(const QUrl &imageUrl)
{
m_currentUrl = imageUrl;
m_requestId = QUuid::createUuid().toString();
TCHttpService::getInstance()->downloadImage(m_requestId, imageUrl);
}
void FrmImgShow::setImage(const QPixmap &pixmap)
{
// int h = pixmap.height();
// int w = pixmap.width();
// int sh, sw;
// if (h >= w) {
// sh = 140;
// sw = w * h / 140;
// }
// else {
// sw = 140;
// sh = h * w /140;
// }
labImg->setPixmap(pixmap.scaled(this->labImg->width(), this->labImg->height()));
}
void FrmImgShow::initSignalSlot()
{
connect(btnCopy, &QPushButton::clicked, this, [this](){
switch(FrmAlbum::getCopyType()) {
case 0:
{
QClipboard* clipboard = QApplication::clipboard();
QString mdStr = QString("![](%1)").arg(m_currentUrl.toString());
clipboard->setText(mdStr);
break;
}
case 1:
{
QClipboard* clipboard = QApplication::clipboard();
QString urlStr = m_currentUrl.toString();
clipboard->setText(urlStr);
break;
}
case 2:
{
QClipboard* clipboard = QApplication::clipboard();
QString htmlStr = QString("<img src=\"%1\"/>").arg(m_currentUrl.toString());
clipboard->setText(htmlStr);
break;
}
case 3:
{
QClipboard* clipboard = QApplication::clipboard();
QString ubbStr = QString("[IMG]%1[/IMG]").arg(m_currentUrl.toString());
clipboard->setText(ubbStr);
break;
}
}
});
connect(ckbSelect, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state){
if (state == Qt::Unchecked) {
emit signal_imageUnselected(m_currentUrl.toString());
}
if (state == Qt::Checked) {
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();
});
}
QSize FrmImgShow::sizeHint()
{
return QSize(300, 300);
}
bool FrmImgShow::eventFilter(QObject *watched, QEvent *event)
@@ -54,23 +149,63 @@ void FrmImgShow::onFinished(QNetworkReply *reply)
void FrmImgShow::initForm()
{
this->setWindowFlag(Qt::FramelessWindowHint);
this->setWindowFlags(this->windowFlags() | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
setAttribute(Qt::WA_TranslucentBackground);
vLayout = new QVBoxLayout(this);
setLayout(vLayout);
labImg = new QLabel();
btnCopy = new QToolButton();
btnDelete = new QToolButton();
btnCopy = new QPushButton();
btnCopy->setMinimumSize(22, 22);
btnCopy->setFlat(true);
btnCopy->setIcon(QIcon(":/qrc/image/copy_white.png"));
btnCopy->setCursor(Qt::PointingHandCursor);
btnCopy->installEventFilter(this);
btnDelete = new QPushButton();
btnDelete->setMinimumSize(22, 22);
btnDelete->setFlat(true);
btnDelete->setIcon(QIcon(":/qrc/image/delete_white.png"));
btnDelete->installEventFilter(this);
btnDelete->setCursor(Qt::PointingHandCursor);
horizenSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
hLayout = new QHBoxLayout();
vLayout = new QVBoxLayout();
ckbSelect = new QCheckBox();
ckbSelect->setText("");
ckbSelect->setMinimumSize(20, 20);
ckbSelect->setCursor(Qt::PointingHandCursor);
// ckbSelect->setStyleSheet("border:1px solid white;border-radius:5px");
// ckbSelect->setStyleSheet("border-style:none;background-color:green;spacing:0px;");
hLayout->addWidget(btnCopy);
hLayout->addWidget(btnDelete);
hLayout->setContentsMargins(0, 0, 0, 0);
hLayout->addSpacerItem(horizenSpacer);
hLayout->addWidget(ckbSelect);
hLayout->setSpacing(0);
vLayout->addWidget(labImg);
vLayout->addLayout(hLayout);
this->setLayout(vLayout);
vLayout->setContentsMargins(0, 0, 0, 0);
btnCopy->setIcon(QIcon(QPixmap(":/qrc/image/copy_white.png")));
btnDelete->setIcon(QIcon(QPixmap(":/qrc/image/delete_white.png")));
btnCopy->setFixedSize(32, 32);
btnCopy->setCursor(Qt::PointingHandCursor);
// btnCopy->setIcon(QIcon(QPixmap(":/qrc/image/copy_white.png")));
// btnDelete->setIcon(QIcon(QPixmap(":/qrc/image/delete_white.png")));
// btnCopy->setFixedSize(32, 32);
// btnCopy->setCursor(Qt::PointingHandCursor);
// setStyleSheet("background-color: #FF0000");
setFixedSize(134, 160);
this->labImg->setMinimumSize(130, 130);
}
void FrmImgShow::initWidget()
@@ -78,15 +213,3 @@ void FrmImgShow::initWidget()
btnCopy->installEventFilter(this);
btnDelete->installEventFilter(this);
}
void FrmImgShow::initManager()
{
manager = new QNetworkAccessManager();
QClipboard* clipboard = QGuiApplication::clipboard();
connect(manager, &QNetworkAccessManager::finished,
this, &FrmImgShow::onFinished);
connect(btnCopy, &QToolButton::clicked, [&](){
clipboard->setText(this->url);
});
}

View File

@@ -8,30 +8,37 @@
#include <QVBoxLayout>
#include <QToolButton>
#include <QSpacerItem>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QUrl>
#include <QNetworkReply>
#include <QCheckBox>
#include <QClipboard>
#include <QApplication>
#include <QGuiApplication>
#include "tchttpservice.h"
class FrmImgShow : public QWidget
{
Q_OBJECT
public:
explicit FrmImgShow(QString& url, QWidget *parent = nullptr);
explicit FrmImgShow(QWidget *parent = nullptr);
void loadImage(const QUrl& imageUrl);
void setImage(const QPixmap& pixmap);
void initSignalSlot();
virtual QSize sizeHint();
private:
QLabel* labImg;
QToolButton* btnCopy;
QToolButton* btnDelete;
// QLabel* labLoading;
// QMovie* movieLoading;
QPushButton* btnCopy;
QPushButton* btnDelete;
QSpacerItem* horizenSpacer;
QHBoxLayout* hLayout;
QCheckBox* ckbSelect;
QVBoxLayout* vLayout;
QNetworkAccessManager* manager;
QString url;
protected:
virtual bool eventFilter(QObject* watched, QEvent* event);
@@ -41,10 +48,14 @@ private slots:
private:
void initForm();
void initWidget();
void initManager();
QString m_requestId;
QUrl m_currentUrl;
signals:
void signal_imageSelected(QString);
void signal_imageUnselected(QString);
void signal_imageDelete();
};
#endif // FRMIMGSHOW_H

View File

@@ -37,6 +37,10 @@ void FrmSetting::initForm()
ui->schEnableSsl->enableText(false);
ui->schEnableSsl->setAnimation(true);
ui->schAutoLogin->setBgColorOn(QColor("#409EFF"));
ui->schAutoLogin->enableText(false);
ui->schAutoLogin->setAnimation(true);
ui->btnServer->setCursor(Qt::PointingHandCursor);
ui->schRename->setCursor(Qt::PointingHandCursor);
@@ -81,23 +85,36 @@ void FrmSetting::initWidget()
ui->labTimeRenameClose->setStyleSheet(OPENQSS);
}
if (FileConfigDecode::getInstance()->getAutoCopy()) {
ui->labEnableSsl->setStyleSheet(OPENQSS);
ui->labEnableSsl->setStyleSheet(CLOSEQSS);
ui->labEnableSslOpen->setStyleSheet(OPENQSS);
ui->labEnableSslClose->setStyleSheet(CLOSEQSS);
}
else {
ui->labEnableSsl->setStyleSheet(CLOSEQSS);
ui->labEnableSsl->setStyleSheet(OPENQSS);
ui->labEnableSslOpen->setStyleSheet(CLOSEQSS);
ui->labEnableSslClose->setStyleSheet(OPENQSS);
}
if (FileConfigDecode::getInstance()->getAutoLogin()) {
ui->labAUtoLoginOpen->setStyleSheet(OPENQSS);
ui->labAutoLoginClose->setStyleSheet(CLOSEQSS);
TCHttpService::getInstance()->setConfiguration(FileConfigDecode::getInstance()->getUserName(),
FileConfigDecode::getInstance()->getPassword(),
FileConfigDecode::getInstance()->getAddress());
}
else {
ui->labAUtoLoginOpen->setStyleSheet(CLOSEQSS);
ui->labAutoLoginClose->setStyleSheet(OPENQSS);
}
ui->schRename->setChecked(FileConfigDecode::getInstance()->getRename());
ui->schAutoSetup->setChecked(FileConfigDecode::getInstance()->getAutoSetup());
ui->schTimeRename->setChecked(FileConfigDecode::getInstance()->getTimeRename());
ui->schEnableSsl->setChecked(FileConfigDecode::getInstance()->getAutoCopy());
ui->schAutoLogin->setChecked(FileConfigDecode::getInstance()->getAutoLogin());
connect(ui->schRename, &SwitchButton::checkedChanged, this, &FrmSetting::schRenameSlot);
connect(ui->schAutoSetup, &SwitchButton::checkedChanged, this, &FrmSetting::schAutoSetup);
connect(ui->schTimeRename, &SwitchButton::checkedChanged, this, &FrmSetting::schTimeRename);
connect(ui->schEnableSsl, &SwitchButton::checkedChanged, this, &FrmSetting::schEnableSsl);
connect(ui->schAutoLogin, &SwitchButton::checkedChanged, this, &FrmSetting::schAutoLogin);
connect(ui->btnServer, &QPushButton::clicked, serversetting, &ServerSetting::show);
}
@@ -136,6 +153,13 @@ void FrmSetting::schEnableSsl(bool checked)
}
void FrmSetting::schAutoLogin(bool checked)
{
FileConfigDecode::getInstance()->setAutoLogin(checked);
ui->labAUtoLoginOpen->setStyleSheet(checked?OPENQSS:CLOSEQSS);
ui->labAutoLoginClose->setStyleSheet(checked?CLOSEQSS:OPENQSS);
}
void FrmSetting::slot_updateServerConfig(QString address, QString username, QString password)
{
FileConfigDecode::getInstance()->setAddress(address);

View File

@@ -37,6 +37,7 @@ private slots:
void schAutoSetup(bool checked);
void schTimeRename(bool checked);
void schEnableSsl(bool checked);
void schAutoLogin(bool checked);
void slot_updateServerConfig(QString address, QString username, QString password);

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>731</width>
<height>439</height>
<height>464</height>
</rect>
</property>
<property name="windowTitle">
@@ -352,6 +352,82 @@
</item>
</layout>
</item>
<item>
<widget class="Line" name="line3_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="lanAUtoLogin">
<property name="styleSheet">
<string notr="true">color: rgb(255, 255, 255);</string>
</property>
<property name="text">
<string>自动连接</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="labAutoLoginClose">
<property name="text">
<string>关</string>
</property>
</widget>
</item>
<item>
<widget class="SwitchButton" name="schAutoLogin" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>25</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labAUtoLoginOpen">
<property name="text">
<string>开</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>

View File

@@ -47,25 +47,36 @@ void FrmUpload::slot_uploadFileSec(QString url)
qDebug() << "slot_uploadFileSec:" << url;
QClipboard* clipboard = QApplication::clipboard();
QString domain = FileConfigDecode::getInstance()->getAddress();
QString userName = FileConfigDecode::getInstance()->getUserName();
ImageManager::instance()->addImageUrl(domain, userName, url);
if (copyType == COPY_TYPE_MARKDOWN) {
clipboard->setText(QString("![](%1)").arg(url));
emit signal_uploadSuccess(url);
}
if (copyType == COPY_TYPE_URL) {
clipboard->setText(url);
emit signal_uploadSuccess(url);
}
if (copyType == COPY_TYPE_UBB) {
// [IMG]https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/logo512.png[/IMG]
clipboard->setText(QString("[IMG]%1[/IMG]").arg(url));
emit signal_uploadSuccess(url);
}
if (copyType == COPY_TYPE_HTML) {
clipboard->setText(QString("<img src=\"%1\"/>").arg(url));
emit signal_uploadSuccess(url);
// QThread::sleep(50);
}
}
void FrmUpload::slot_progressUpdate(int v)
{
ui->progressBar->setValue(v);
}
bool FrmUpload::eventFilter(QObject *watched, QEvent *event)
{
static bool mousePressed = false;
@@ -155,6 +166,8 @@ void FrmUpload::initWidget()
this->setAcceptDrops(true);
setWindowFlags(Qt::FramelessWindowHint); // 移除系统边框
setAttribute(Qt::WA_TranslucentBackground); // 启用透明背景
connect(TCHttpService::getInstance(), &TCHttpService::signal_progressUpdate, this, &FrmUpload::slot_progressUpdate);
// ui->frmUpload->setAcceptDrops(true);
}
@@ -175,6 +188,7 @@ void FrmUpload::on_btnFastUpload_clicked()
{
// QString addDataPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
// QString cacheDirPath = addDataPath + "/cache/";
QDir cacheDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
if (!cacheDir.exists()) {
cacheDir.mkpath(".");
@@ -183,6 +197,7 @@ void FrmUpload::on_btnFastUpload_clicked()
const QMimeData* mimeData = clipboard->mimeData();
if (mimeData->hasImage()) {
ui->progressBar->setValue(0);
QImage image = clipboard->image();
if (!image.isNull()) {
RenameType renametype = FileConfigDecode::getInstance()->getRenameType();

View File

@@ -46,6 +46,7 @@ public:
public slots:
void slot_uploadFileSec(QString url);
void slot_progressUpdate(int v);
protected:
virtual bool eventFilter(QObject* watched, QEvent* event);
@@ -70,6 +71,9 @@ private:
// 0 md 1 url
CopyType copyType = COPY_TYPE_MARKDOWN;
signals:
void signal_uploadSuccess(QString url);
private:
Ui::FrmUpload *ui;
};

View File

@@ -162,6 +162,45 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QProgressBar" name="progressBar">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>10</height>
</size>
</property>
<property name="value">
<number>0</number>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
<property name="textVisible">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>

View File

@@ -0,0 +1,166 @@
#pragma execution_character_set("utf-8")
#include "panelwidget.h"
#include "qscrollarea.h"
#include "qframe.h"
#include "qboxlayout.h"
#include "qdebug.h"
PanelWidget::PanelWidget(QWidget *parent) : QWidget(parent)
{
scrollArea = new QScrollArea(this);
scrollArea->setObjectName("scrollAreaMain");
scrollArea->setWidgetResizable(true);
scrollAreaWidgetContents = new QWidget();
scrollAreaWidgetContents->setGeometry(QRect(0, 0, 100, 100));
verticalLayout = new QVBoxLayout(scrollAreaWidgetContents);
verticalLayout->setSpacing(0);
verticalLayout->setContentsMargins(0, 0, 0, 0);
frame = new QFrame(scrollAreaWidgetContents);
frame->setObjectName("frameMain");
gridLayout = new QGridLayout(frame);
gridLayout->setSpacing(0);
gridLayout->setContentsMargins(0, 0, 0, 0);
verticalLayout->addWidget(frame);
scrollArea->setWidget(scrollAreaWidgetContents);
frame->setStyleSheet("QFrame#frameMain{border-width:0px;}");
margin = 0;
space = 0;
autoWidth = false;
autoHeight = false;
}
void PanelWidget::resizeEvent(QResizeEvent *)
{
scrollArea->resize(this->size());
}
QSize PanelWidget::sizeHint() const
{
return QSize(300, 200);
}
QSize PanelWidget::minimumSizeHint() const
{
return QSize(20, 20);
}
int PanelWidget::getMargin() const
{
return this->margin;
}
int PanelWidget::getSpace() const
{
return this->space;
}
bool PanelWidget::getAutoWidth() const
{
return this->autoWidth;
}
bool PanelWidget::getAutoHeight() const
{
return this->autoHeight;
}
QList<QWidget *> PanelWidget::getWidgets()
{
return this->widgets;
}
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;
this->columnCount = columnCount;
int row = 0;
int column = 0;
int index = 0;
//先把之前的所有移除并不可见
foreach (QWidget *widget, widgets) {
gridLayout->removeWidget(widget);
widget->setVisible(false);
}
//重新添加到布局中并可见
foreach (QWidget *widget, widgets) {
gridLayout->addWidget(widget, row, column);
widget->setVisible(true);
column++;
index++;
if (index % columnCount == 0) {
row++;
column = 0;
}
}
row++;
//设置右边弹簧
if (!autoWidth) {
QSpacerItem *hSpacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(hSpacer, 0, gridLayout->columnCount());
}
//设置底边弹簧
if (!autoHeight) {
QSpacerItem *vSpacer = new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding);
gridLayout->addItem(vSpacer, row, 0);
}
}
void PanelWidget::setMargin(int left, int top, int right, int bottom)
{
gridLayout->setContentsMargins(left, top, right, bottom);
}
void PanelWidget::setMargin(int margin)
{
if (this->margin != margin) {
setMargin(margin, margin, margin, margin);
}
}
void PanelWidget::setSpace(int space)
{
if (this->space != space) {
gridLayout->setSpacing(space);
}
}
void PanelWidget::setAutoWidth(bool autoWidth)
{
if (this->autoWidth != autoWidth) {
this->autoWidth = autoWidth;
}
}
void PanelWidget::setAutoHeight(bool autoHeight)
{
if (this->autoHeight != autoHeight) {
this->autoHeight = autoHeight;
}
}

View File

@@ -0,0 +1,77 @@
#ifndef PANELWIDGET_H
#define PANELWIDGET_H
#include <QWidget>
#include <QPainterPath>
class QScrollArea;
class QFrame;
class QVBoxLayout;
class QGridLayout;
#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif
class QDESIGNER_WIDGET_EXPORT PanelWidget : public QWidget
#else
class PanelWidget : public QWidget
#endif
{
Q_OBJECT
// Q_PROPERTY(int margin READ getMargin WRITE setMargin)
// Q_PROPERTY(int space READ getSpace WRITE setSpace)
// Q_PROPERTY(bool autoWidth READ getAutoWidth WRITE setAutoWidth)
// Q_PROPERTY(bool autoHeight READ getAutoHeight WRITE setAutoHeight)
public:
explicit PanelWidget(QWidget *parent = 0);
protected:
void resizeEvent(QResizeEvent *);
private:
QScrollArea *scrollArea; //滚动区域
QWidget *scrollAreaWidgetContents; //滚动区域载体
QFrame *frame; //放置设备的框架,自动变宽变高
QVBoxLayout *verticalLayout; //设备面板总布局
QGridLayout *gridLayout; //设备表格布局
int margin; //边距
int space; //设备之间的间隔
bool autoWidth; //宽度自动拉伸
bool autoHeight; //高度自动拉伸
QList<QWidget *> widgets; //设备面板对象集合
int columnCount; //面板列数
public:
QSize sizeHint() const;
QSize minimumSizeHint() const;
int getMargin() const;
int getSpace() const;
bool getAutoWidth() const;
bool getAutoHeight() const;
QList<QWidget *> getWidgets();
int getColumnCount();
void clearWidgets();
public Q_SLOTS:
void setWidget(QList<QWidget *> widgets, int columnCount);
void setMargin(int left, int top, int right, int bottom);
void setMargin(int margin);
void setSpace(int space);
void setAutoWidth(bool autoWidth);
void setAutoHeight(bool autoHeight);
};
#endif // PANELWIDGET_H

View File

@@ -0,0 +1,5 @@
HEADERS += \
$$PWD/panelwidget.h
SOURCES += \
$$PWD/panelwidget.cpp

View File

@@ -4,3 +4,6 @@ include($$PWD/fileconfigdecode/fileconfigdecode.pri)
INCLUDEPATH += $$PWD/tchttpservice
include($$PWD/tchttpservice/tchttpservice.pri)
INCLUDEPATH += $$PWD/urldatabase
include($$PWD/urldatabase/urldatabase.pri)

View File

@@ -24,8 +24,7 @@ FileConfigDecode *FileConfigDecode::getInstance()
FileConfigDecode::~FileConfigDecode()
{
// updateFile();
// qDebug() << "write:" << autoSetup << rename << timeRename << autoCopy;
updateFile();
}
QString FileConfigDecode::getAddress()
@@ -73,23 +72,27 @@ RenameType FileConfigDecode::getRenameType()
return renameType;
}
bool FileConfigDecode::getAutoLogin()
{
return autoLogin;
}
void FileConfigDecode::setAddress(QString value)
{
this->address = value;
// updateFile();
updateFile();
}
void FileConfigDecode::setPort(quint16 value)
{
this->port = value;
// updateFile();
updateFile();
}
void FileConfigDecode::setAutoSetup(bool value)
{
this->autoSetup = value;
updateFile();
// updateFile();
}
void FileConfigDecode::setRename(bool value)
@@ -101,13 +104,13 @@ void FileConfigDecode::setRename(bool value)
else {
renameType = (renameType == RENAME_TYPE_TIME) ? RENAME_TYPE_TIME : RENAME_TYPE_NORMAL;
}
qDebug() << renameType;
// qDebug() << renameType;
updateFile();
// updateFile();
}
void FileConfigDecode::setTimeRename(bool value, int flag)
{
qDebug() << value;
this->timeRename = value;
if (value) {
renameType = RENAME_TYPE_TIME;
@@ -120,16 +123,14 @@ void FileConfigDecode::setTimeRename(bool value, int flag)
if (!value && flag == 0) {
renameType = RENAME_TYPE_NONE;
}
qDebug() << renameType;
// qDebug() << renameType;
updateFile();
// updateFile();
}
void FileConfigDecode::setAutoCopy(bool value)
{
this->autoCopy = value;
updateFile();
// updateFile();
}
void FileConfigDecode::setUserName(QString username)
@@ -144,8 +145,14 @@ void FileConfigDecode::setPassword(QString password)
updateFile();
}
void FileConfigDecode::fileWrite(QString path, QString address, bool autosetup,
bool rename, bool timerename, bool autocopy, QString username, QString password)
void FileConfigDecode::setAutoLogin(bool value)
{
autoLogin = value;
updateFile();
}
void FileConfigDecode::fileWrite(QString path)
{
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
QSettings* config = new QSettings(path, QSettings::IniFormat);
@@ -153,7 +160,6 @@ void FileConfigDecode::fileWrite(QString path, QString address, bool autosetup,
QString section = QString("config");
config->beginGroup(section);
config->setValue("address", address);
config->setValue("port", port);
config->setValue("autosetup", autosetup);
config->setValue("rename", rename);
config->setValue("timerename", timerename);
@@ -166,14 +172,13 @@ void FileConfigDecode::fileWrite(QString path, QString address, bool autosetup,
QString section = QString("config");
config->beginGroup(section);
config->setValue("address", address);
config->setValue("port", port);
config->setValue("autosetup", autosetup);
config->setValue("autosetup", autoSetup);
config->setValue("rename", rename);
config->setValue("timerename", timerename);
config->setValue("autocopy", autocopy);
config->setValue("username", username);
config->setValue("timerename", timeRename);
config->setValue("autocopy", autoCopy);
config->setValue("username", userName);
config->setValue("password", password);
config->endGroup();
config->setValue("autologin", autoLogin);
delete config;
#endif
}
@@ -196,12 +201,14 @@ void FileConfigDecode::initFile()
this->autoCopy = config->value(section + "autocopy").toBool();
this->userName = config->value(section+"username").toString();
this->password = config->value(section+"password").toString();
this->autoLogin = config->value(section+"autologin").toBool();
checkConfig();
this->firstCreate = false;
}
else {
qDebug() << "file not exists";
this->firstCreate = true;
this->address = "127.0.0.1:8080";
@@ -211,8 +218,9 @@ void FileConfigDecode::initFile()
this->autoCopy = false;
this->userName = "admin";
this->password = "admin";
this->autoLogin = false;
fileWrite(addFilePath, address, autoSetup, rename, timeRename, autoCopy, userName, password);
fileWrite(addFilePath);
}
}
@@ -235,7 +243,7 @@ void FileConfigDecode::updateFile()
QString addDataPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
QString addFilePath = addDataPath + "/config.ini";
qDebug() << "write" << autoSetup << rename << timeRename << autoCopy;
fileWrite(addFilePath, address, autoSetup, rename, timeRename, autoCopy, userName, password);
// qDebug() << "write" << this->autoSetup << this->rename << this->timeRename << this->autoCopy;
fileWrite(addFilePath);
}

View File

@@ -32,6 +32,7 @@ public:
QString getUserName();
QString getPassword();
RenameType getRenameType();
bool getAutoLogin();
void setAddress(QString value);
void setPort(quint16 value);
@@ -41,6 +42,7 @@ public:
void setAutoCopy(bool value);
void setUserName(QString username);
void setPassword(QString password);
void setAutoLogin(bool value);
void initFile();
void updateFile();
@@ -54,12 +56,13 @@ private:
bool autoCopy;
QString userName;
QString password;
bool autoLogin;
bool firstCreate;
RenameType renameType = RENAME_TYPE_NONE;
void fileWrite(QString path, QString address, bool autosetup, bool rename, bool timerename, bool autocopy, QString username, QString password);
void fileWrite(QString path);
static QScopedPointer<FileConfigDecode> m_instance;

View File

@@ -40,120 +40,25 @@ void TCHttpService::apiLogin()
QObject::connect(reply, &QNetworkReply::finished, [this, reply]() {
emit requestFinished(reply, "login");
});
}
void TCHttpService::apiMyfileCount()
{
QString urlStr;
if (m_enableSsl)
urlStr = "https://" + m_domain + "/api/myfiles";
else
urlStr = "http://" + m_domain + "/api/myfiles";
QMap<QString, QString> headers;
headers.insert("Content-Type", "application/json");
QMap<QString, QString> params;
params.insert("cmd", "count");
QUrl url = encodeUrl(urlStr, params);
QJsonObject jsonObj;
jsonObj["token"] = m_token;
jsonObj["user"] = m_userName;
QJsonDocument jsonDoc(jsonObj);
QByteArray jsonData = jsonDoc.toJson();
QNetworkRequest request(url);
for (auto ite = headers.constBegin(); ite != headers.constEnd(); ite++){
request.setRawHeader(ite.key().toUtf8(), ite.value().toUtf8());
}
QNetworkReply* reply = nullptr;
reply = m_manager.post(request, jsonData);
QObject::connect(reply, &QNetworkReply::finished, [this, reply](){
emit requestFinished(reply, "myfilecount");
});
}
void TCHttpService::apiMyfileNormal(int start, int count)
{
QString urlStr;
if (m_enableSsl)
urlStr = "https://" + m_domain + "/api/myfiles";
else
urlStr = "http://" + m_domain + "/api/myfiles";
QMap<QString, QString> headers;
headers.insert("Content-Type", "application/json");
QMap<QString, QString> params;
params.insert("cmd", "normal");
QUrl url = encodeUrl(urlStr, params);
QNetworkRequest request(url);
for (auto ite = headers.constBegin(); ite != headers.constEnd(); ite++){
request.setRawHeader(ite.key().toUtf8(), ite.value().toUtf8());
}
QJsonObject jsonObj;
jsonObj["token"] = m_token;
jsonObj["user"] = m_userName;
jsonObj["count"] = count;
jsonObj["start"] = start;
QJsonDocument jsonDoc(jsonObj);
QByteArray jsonData = jsonDoc.toJson();
QNetworkReply* reply = nullptr;
reply = m_manager.post(request, jsonData);
connect(reply, &QNetworkReply::finished, [this, reply](){
emit requestFinished(reply, "myfilenormal");
});
}
void TCHttpService::apiMd5(const QString& filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll());
if (jsonDoc.isEmpty())
return;
QJsonObject jsonObj = jsonDoc.object();
int code = jsonObj["code"].toInt();
if (code == 0) {
this->m_token = jsonObj["token"].toString();
qDebug() << this->m_token;
m_isOnline = true;
ImageManager::instance()->addDomainUser(m_domain, m_userName);
QString stdPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
ImageManager::instance()->initialize(stdPath + "/picpanel.db");
emit signal_loginSuc();
}
QByteArray fileMd5;
QCryptographicHash hash(QCryptographicHash::Md5);
if (hash.addData(&file)) {
fileMd5 = hash.result().toHex();
}
else
return;
QString urlStr;
if (m_enableSsl)
urlStr = "https://" + m_domain + "/api/md5";
else
urlStr = "http://" + m_domain + "/api/md5";
QMap<QString, QString> headers;
headers.insert("Content-Type", "application/json");
QString md5Str = QString::fromUtf8(fileMd5);
QJsonObject jsonObj;
jsonObj["token"] = m_token;
jsonObj["md5"] = md5Str;
jsonObj["filename"] = QFileInfo(file).fileName();
jsonObj["user"] = m_userName;
file.close();
QJsonDocument jsonDoc(jsonObj);
QByteArray jsonData = jsonDoc.toJson();
QNetworkReply* reply = nullptr;
QNetworkRequest request(urlStr);
reply = m_manager.post(request, jsonData);
QObject::connect(reply, &QNetworkReply::finished, [this, reply](){
emit requestFinished(reply, "md5");
});
}
void TCHttpService::apiUpload(const QString &filePath)
@@ -229,155 +134,33 @@ void TCHttpService::apiUpload(const QString &filePath)
connect(reply, &QNetworkReply::finished, this, [=]() {
if (reply->error() == QNetworkReply::NoError) {
qDebug() << "上传成功:";
apiMyfileCount();
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll());
QJsonObject jsonObj = jsonDoc.object();
QString fileUrl = jsonObj["url"].toString();
ImageManager::instance()->addImageUrl(m_domain, m_userName, fileUrl);
emit signal_uploadFileSec(fileUrl);
} else {
qDebug() << "上传失败:" << reply->errorString();
}
reply->deleteLater();
multiPart->deleteLater();
});
connect(reply, &QNetworkReply::uploadProgress, this, [](qint64 bytesSent, qint64 bytesTotal) {
connect(reply, &QNetworkReply::uploadProgress, this, [this](qint64 bytesSent, qint64 bytesTotal) {
if (bytesTotal > 0) {
int progress = (bytesSent * 100) / bytesTotal;
emit signal_progressUpdate(progress);
qDebug() << "上传进度:" << progress << "%";
}
});
}
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;
this->m_userName = userName;
this->m_firstPwd = firstPwd;
connect(this, &TCHttpService::requestFinished, [this](QNetworkReply* reply, QString api){
QByteArray rawData = reply->readAll();
if (api == "login") {
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
if (jsonDoc.isEmpty())
return;
QJsonObject jsonObj = jsonDoc.object();
int code = jsonObj["code"].toInt();
if (code == 0) {
this->m_token = jsonObj["token"].toString();
qDebug() << this->m_token;
apiMyfileCount();
}
}
if (api == "myfilecount") {
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
if (jsonDoc.isEmpty())
return;
QJsonObject jsonObj = jsonDoc.object();
int code = jsonObj["code"].toInt();
if (code == 0) {
int total = jsonObj["total"].toInt();
this->m_total = total;
int n = total / 10 + 1;
int pendingRequests = n;
for (int i = 0; i < n; i++) {
int count = (total - i * 10 >= 10) ? 10 : (total - i * 10);
apiMyfileNormal(i*10, count);
}
}
}
if (api == "myfilenormal") {
static int loginCnt = 0;
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
if (jsonDoc.isEmpty())
return;
QJsonObject jsonObj = jsonDoc.object();
int code = jsonObj["code"].toInt();
if (code != 0)
return;
QJsonArray jsonArray = jsonObj["files"].toArray();
for (const QJsonValue& value : jsonArray) {
QJsonObject jsonObj = value.toObject();
QString file_name = jsonObj["file_name"].toString();
int share_status = jsonObj["share_status"].toInt();
QString url = jsonObj["url"].toString();
qint64 size = jsonObj["size"].toInt();
QString md5 = jsonObj["md5"].toString();
QMap<QString, file_info_t>::iterator ite;
ite = m_fileMap.find(md5);
if (ite == m_fileMap.end()) {
qDebug() << file_name;
file_info_t info;
info.share_status = share_status;
info.size = size;
info.url = url;
info.file_name = file_name;
if (m_isOnline) {
qDebug() << "now upload";
emit signal_uploadFileSec(url);
}
m_fileMap.insert(md5, info);
// if (m_fileMap.size() == m_total && m_isOnline == false)
}
#if !DEBUG
// for(auto ite = m_fileMap.constBegin(); ite != m_fileMap.constEnd(); ite++) {
// qDebug() << "fileMap debug:" << ite.value().file_name;
// }
qDebug() << "fileMap size:" << m_fileMap.size();
#endif
}
if (!m_isOnline) {
loginCnt++;
qDebug() << "loginCnt:" << loginCnt;
if (loginCnt == m_total/10+1) {
m_isOnline = true;
qDebug() << "login success";
}
}
}
// if (api == "upload") {
// qDebug() <<"upload";
// QJsonDocument jsondoc = QJsonDocument::fromJson(rawData);
// QJsonObject jsonObj = jsondoc.object();
// int code = jsonObj["code"].toInt();
// if (code == 0)
// this->apiMyfileCount();
// }
reply->deleteLater();
});
apiLogin();
}
@@ -396,6 +179,73 @@ void TCHttpService::setUploadNum(int nb)
this->m_uploadNum = nb;
}
void TCHttpService::downloadImage(const QString &requestId, const QUrl &imageUrl)
{
#if 1
QPixmap cachedPixmap;
if (QPixmapCache::find(imageUrl.toString(), &cachedPixmap)) {
emit signal_imageDownloaded(requestId, cachedPixmap);
return;
}
if (getCachedImage(imageUrl, cachedPixmap)) {
QPixmapCache::insert(imageUrl.toString(), cachedPixmap);
emit signal_imageDownloaded(requestId, cachedPixmap);
return;
}
#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](){
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())) {
cacheImage(reply->url(), pixmap);
emit signal_imageDownloaded(requestId, pixmap);
}
else {
emit signal_downloadFailed(requestId, "Failed to load image data");
}
}
reply->deleteLater();
});
// 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)
{
QUrlQuery query;
@@ -409,20 +259,99 @@ QUrl TCHttpService::encodeUrl(QString urlStr, QMap<QString, QString> params)
return url;
}
void TCHttpService::updateFileMap(QJsonObject jsonObj)
void TCHttpService::cleanOldCacheFiles()
{
// QString fileMD5 = jsonObj["md5"].toString();
// QString fileUrl = jsonObj["http"].toString();
QDir cacheDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
cacheDir.setNameFilters(QStringList() << "*.png" << "*.jpg" << "*.jpeg" << "*.svg");
cacheDir.setFilter(QDir::Files);
// QMap<QString, file_info_t>::iterator ite = m_fileMap.begin();
// if (ite != m_fileMap.end())
// return;
foreach (QString dirFile, cacheDir.entryList()) {
QFileInfo fileInfo(cacheDir.absoluteFilePath(dirFile));
if (fileInfo.lastModified().daysTo(QDateTime::currentDateTime()) > m_max_cache_days) {
cacheDir.remove(dirFile);
}
}
// m_fileMap.insert(fileMD5, fileUrl);
qint64 totalSize = 0;
QFileInfoList files = cacheDir.entryInfoList(QDir::Files, QDir::Time | QDir::Reversed);
foreach(QFileInfo file, files) {
totalSize += file.size();
}
if (totalSize > m_disk_cache_size_mb * 1024 * 1024) {
foreach (QFileInfo file, files) {
if (totalSize <= m_disk_cache_size_mb * 1024 * 1024 * 0.9)
break;
totalSize -= file.size();
QFile::remove(file.absoluteFilePath());
}
}
}
bool TCHttpService::getCachedImage(const QUrl &imageUrl, QPixmap &pixmap)
{
QString filePath = getCacheFilePath(imageUrl);
if (QFile::exists(filePath)) {
QFileInfo info(filePath);
if (info.lastModified().daysTo(QDateTime::currentDateTime()) > m_max_cache_days) {
QFile::remove(filePath);
return false;
}
if (pixmap.load(filePath)) {
return true;
}
}
return false;
}
QString TCHttpService::getCacheFilePath(const QUrl &imageUrl)
{
QCryptographicHash hash(QCryptographicHash::Md5);
hash.addData(imageUrl.toString().toUtf8());
QString fileName = hash.result().toHex() + ".png";
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)
{
}
void TCHttpService::slot_downloadFinished(QNetworkReply *reply)
{
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())) {
cacheImage(reply->url(), pixmap);
emit signal_imageDownloaded(requestId, pixmap);
}
else {
emit signal_downloadFailed(requestId, "Failed to load image data");
}
}
reply->deleteLater();
}

View File

@@ -14,46 +14,58 @@
#include <QJsonArray>
#include <QFile>
#include <QFileInfo>
#include <QPixmap>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QHttpMultiPart>
#include <QHash>
#include <QPixmapCache>
#include <QDir>
#include "urldatabase.h"
class TCHttpService : public QObject
{
Q_OBJECT
private:
typedef struct {
QString file_name;
int share_status;
QString url;
qint64 size;
} file_info_t;
QMap<QString, file_info_t> m_fileMap;
public:
static TCHttpService* getInstance();
void apiLogin();
#if 0
void apiMyfileCount();
void apiMyfileNormal(int start, int count);
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();
void setUploadNum(int nb);
void downloadImage(const QString& requestId, const QUrl& imageUrl);
private:
QUrl encodeUrl(QString url, QMap<QString, QString> params);
void updateFileMap(QJsonObject jsonObj);
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();
void signal_uploadSuc();
void signal_shareSuc();
void signal_uploadFileSec(QString url);
void requestFinished(QNetworkReply* reply, QString api);
void signal_imageDownloaded(const QString& requestId, const QPixmap& pixmap);
void signal_downloadFailed(const QString& requestId, const QString& error);
void signal_progressUpdate(int);
private:
explicit TCHttpService(QObject *parent = nullptr);
@@ -65,6 +77,11 @@ private:
QString m_domain;
QString m_firstPwd;
QString m_userName;
int m_memory_cache_size_kb = 10240;
int m_disk_cache_size_mb = 100;
int m_max_cache_days = 30;
int m_total;
bool m_enableSsl = true;
@@ -72,6 +89,10 @@ private:
bool m_uploadNum = 0;
QHash<QNetworkReply*, QString> m_pendingRequests;
private slots:
void slot_downloadFinished(QNetworkReply* reply);
};
#endif // TCHTTPSERVICE_H

View File

@@ -0,0 +1,244 @@
#include "urldatabase.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
ImageManager* ImageManager::m_instance = nullptr;
QMutex ImageManager::m_mutex;
ImageManager::ImageManager(QObject *parent) : QObject(parent)
{
}
ImageManager::~ImageManager()
{
if (m_db.isOpen()) {
m_db.close();
}
}
ImageManager* ImageManager::instance()
{
QMutexLocker locker(&m_mutex);
if (!m_instance) {
m_instance = new ImageManager();
}
return m_instance;
}
bool ImageManager::initialize(const QString &dbPath)
{
m_db = QSqlDatabase::addDatabase("QSQLITE", "image_manager_connection");
m_db.setDatabaseName(dbPath);
if (!m_db.open()) {
qWarning() << "Failed to open database:" << m_db.lastError().text();
return false;
}
return createTables();
}
bool ImageManager::createTables()
{
QSqlQuery query(m_db);
// 创建域名表
if (!query.exec("CREATE TABLE IF NOT EXISTS domains ("
"domain_id INTEGER PRIMARY KEY AUTOINCREMENT, "
"domain TEXT NOT NULL UNIQUE)")) {
qWarning() << "Failed to create domains table:" << query.lastError().text();
return false;
}
// 创建用户表
if (!query.exec("CREATE TABLE IF NOT EXISTS users ("
"user_id INTEGER PRIMARY KEY AUTOINCREMENT, "
"username TEXT NOT NULL UNIQUE)")) {
qWarning() << "Failed to create users table:" << query.lastError().text();
return false;
}
// 创建域名-用户关联表(确保唯一)
if (!query.exec("CREATE TABLE IF NOT EXISTS domain_users ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"domain_id INTEGER NOT NULL, "
"user_id INTEGER NOT NULL, "
"UNIQUE(domain_id, user_id), "
"FOREIGN KEY(domain_id) REFERENCES domains(domain_id), "
"FOREIGN KEY(user_id) REFERENCES users(user_id))")) {
qWarning() << "Failed to create domain_users table:" << query.lastError().text();
return false;
}
// 创建图片URL表
if (!query.exec("CREATE TABLE IF NOT EXISTS image_urls ("
"url_id INTEGER PRIMARY KEY AUTOINCREMENT, "
"domain_user_id INTEGER NOT NULL, "
"image_url TEXT NOT NULL, "
"upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, "
"FOREIGN KEY(domain_user_id) REFERENCES domain_users(id), "
"UNIQUE(domain_user_id, image_url))")) {
qWarning() << "Failed to create image_urls table:" << query.lastError().text();
return false;
}
return true;
}
bool ImageManager::addDomain(const QString &domain)
{
QSqlQuery query(m_db);
query.prepare("INSERT OR IGNORE INTO domains (domain) VALUES (?)");
query.addBindValue(domain);
return query.exec();
}
bool ImageManager::addUser(const QString &user)
{
QSqlQuery query(m_db);
query.prepare("INSERT OR IGNORE INTO users (username) VALUES (?)");
query.addBindValue(user);
return query.exec();
}
int ImageManager::getDomainId(const QString &domain)
{
QSqlQuery query(m_db);
query.prepare("SELECT domain_id FROM domains WHERE domain = ?");
query.addBindValue(domain);
if (query.exec() && query.next()) {
return query.value(0).toInt();
}
return -1;
}
int ImageManager::getUserId(const QString &user)
{
QSqlQuery query(m_db);
query.prepare("SELECT user_id FROM users WHERE username = ?");
query.addBindValue(user);
if (query.exec() && query.next()) {
return query.value(0).toInt();
}
return -1;
}
bool ImageManager::addDomainUser(const QString &domain, const QString &user)
{
if (!addDomain(domain) || !addUser(user)) {
return false;
}
int domainId = getDomainId(domain);
int userId = getUserId(user);
if (domainId == -1 || userId == -1) {
return false;
}
QSqlQuery query(m_db);
query.prepare("INSERT OR IGNORE INTO domain_users (domain_id, user_id) VALUES (?, ?)");
query.addBindValue(domainId);
query.addBindValue(userId);
return query.exec();
}
bool ImageManager::addImageUrl(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("INSERT OR IGNORE INTO image_urls (domain_user_id, image_url) VALUES (?, ?)");
query.addBindValue(domainUserId);
query.addBindValue(imageUrl.toString());
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;
int domainId = getDomainId(domain);
int userId = getUserId(user);
if (domainId == -1 || userId == -1) {
return urls;
}
QSqlQuery query(m_db);
query.prepare("SELECT i.image_url FROM image_urls i "
"JOIN domain_users du ON i.domain_user_id = du.id "
"WHERE du.domain_id = ? AND du.user_id = ? "
"ORDER BY i.upload_time DESC");
query.addBindValue(domainId);
query.addBindValue(userId);
if (query.exec()) {
while (query.next()) {
urls.append(QUrl(query.value(0).toString()));
}
}
return urls;
}
bool ImageManager::containsDomainUser(const QString &domain, const QString &user)
{
int domainId = getDomainId(domain);
int userId = getUserId(user);
if (domainId == -1 || userId == -1) {
return false;
}
QSqlQuery query(m_db);
query.prepare("SELECT 1 FROM domain_users WHERE domain_id = ? AND user_id = ?");
query.addBindValue(domainId);
query.addBindValue(userId);
return query.exec() && query.next();
}

View File

@@ -0,0 +1,58 @@
#ifndef URLDATABASE_H
#define URLDATABASE_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDateTime>
#include <QString>
#include <QUrl>
#include <QHash>
#include <QMutex>
#include <QStandardPaths>
class ImageManager : public QObject
{
Q_OBJECT
private:
explicit ImageManager(QObject *parent = nullptr);
~ImageManager();
public:
static ImageManager* instance();
// 初始化数据库连接
bool initialize(const QString &dbPath);
// 添加域名-用户对(不重复)
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);
// 检查域名-用户对是否存在
bool containsDomainUser(const QString &domain, const QString &user);
private:
static ImageManager* m_instance;
static QMutex m_mutex;
QSqlDatabase m_db;
bool createTables();
bool addDomain(const QString &domain);
bool addUser(const QString &user);
int getDomainId(const QString &domain);
int getUserId(const QString &user);
};
#endif // URLDATABASE_H

View File

@@ -0,0 +1,5 @@
HEADERS += \
$$PWD/urldatabase.h
SOURCES += \
$$PWD/urldatabase.cpp

View File

@@ -13,5 +13,6 @@
<file>qrc/image/delete_red.png</file>
<file>qrc/image/delete_white.png</file>
<file>qrc/image/copy_blue.png</file>
<file>qrc/image/icon200.png</file>
</qresource>
</RCC>

View File

@@ -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

Binary file not shown.

Binary file not shown.

BIN
libssl.a

Binary file not shown.

Binary file not shown.

View File

@@ -1,15 +1,17 @@
#include "widget.h"
#include <QApplication>
#include <windows.h>
#include <objbase.h>
#include <QFile>
#include <QStandardPaths>
#include "urldatabase.h"
int main(int argc, char *argv[])
{
// QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication a(argc, argv);
// QString strPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
// strPath += "/picpanel.db";
// ImageManager::instance()->initialize(strPath);
a.setFont(QFont("Microsoft YaHei UI"));
Widget w;
w.setWindowIcon(QIcon(QPixmap(":/qrc/image/icon.png")));

View File

@@ -1,4 +1,4 @@
QT += core gui network
QT += core gui network sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
@@ -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 \

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 14.0.2, 2025-03-25T02:39:05. -->
<!-- Written by QtCreator 4.11.1, 2025-03-26T22:58:21. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@@ -41,7 +41,7 @@
<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">0</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>
@@ -74,10 +74,6 @@
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
<value type="QString">-fno-delayed-template-parsing</value>
</valuelist>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
@@ -103,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">D:\Workspaces\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Workspaces/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>
@@ -142,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">D:\Workspaces\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Workspaces/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>
@@ -183,8 +179,8 @@
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Workspaces\picpanel\build\Desktop_Qt_6_7_3_MinGW_64_bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Workspaces/picpanel/build/Desktop_Qt_6_7_3_MinGW_64_bit-Profile</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>
@@ -242,270 +238,26 @@
<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:D:/Workspaces/picpanel/picpanel.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/Workspaces/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">D:/Workspaces/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>
</data>
<data>
<variable>ProjectExplorer.Project.Target.1</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5142.win64_mingw73_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/Workspaces/build-picpanel-Desktop_Qt_5_14_2_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.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</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.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">D:/Workspaces/build-picpanel-Desktop_Qt_5_14_2_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.LinkQmlDebuggingLibrary">false</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</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.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>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/Workspaces/build-picpanel-Desktop_Qt_5_14_2_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.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</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.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>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/Workspaces/picpanel/picpanel.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/Workspaces/picpanel/picpanel.pro</value>
<value type="QString" key="RunConfiguration.Arguments"></value>
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">2</value>
<value type="qlonglong">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>

View File

@@ -1,319 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.11.1, 2025-03-24T00:02:57. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{4f2ec396-c2e0-4f3d-a369-5968ecaf5cee}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">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="int" 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="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</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="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="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
<value type="QString">-fno-delayed-template-parsing</value>
</valuelist>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5142.win64_mingw73_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/Workspaces/build-picpanel-Desktop_Qt_5_14_2_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.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</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.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">D:/Workspaces/build-picpanel-Desktop_Qt_5_14_2_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.LinkQmlDebuggingLibrary">false</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</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.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>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/Workspaces/build-picpanel-Desktop_Qt_5_14_2_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.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</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>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</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.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>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/Workspaces/picpanel/picpanel.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/Workspaces/picpanel/picpanel.pro</value>
<value type="QString" key="RunConfiguration.Arguments"></value>
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/Workspaces/build-picpanel-Desktop_Qt_5_14_2_MinGW_64_bit-Debug</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">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>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 14.0.2, 2025-03-24T18:42:47. -->
<!-- Written by QtCreator 14.0.2, 2025-03-26T18:36:00. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@@ -94,7 +94,7 @@
<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">0</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">
@@ -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">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>
@@ -172,54 +172,12 @@
<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>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<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-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">E:/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>
<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>
@@ -251,7 +209,7 @@
<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-Debug</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>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 15.0.0, 2025-03-24T02:01:39. -->
<!-- Written by QtCreator 15.0.0, 2025-03-26T01:05:22. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

View File

@@ -1,270 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 14.0.2, 2024-10-15T14:29:17. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{d9771540-486d-4f49-8184-6e87d1101478}</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">8</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">Qt 6.7.3 for macOS</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 6.7.3 for macOS</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.673.clang_64_kit</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</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">/Users/lenn/Workspace/picpanel/picpanel/build/Qt_6_7_3_for_macOS-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Users/lenn/Workspace/picpanel/picpanel/build/Qt_6_7_3_for_macOS-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">/Users/lenn/Workspace/picpanel/picpanel/build/Qt_6_7_3_for_macOS-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Users/lenn/Workspace/picpanel/picpanel/build/Qt_6_7_3_for_macOS-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>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Users/lenn/Workspace/picpanel/picpanel/build/Qt_6_7_3_for_macOS-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Users/lenn/Workspace/picpanel/picpanel/build/Qt_6_7_3_for_macOS-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>
<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>
<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 dwarf,4096 -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/Users/lenn/Workspace/picpanel/picpanel/picpanel.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/Users/lenn/Workspace/picpanel/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">/Users/lenn/Workspace/picpanel/picpanel/build/Qt_6_7_3_for_macOS-Debug/picpanel.app/Contents/MacOS</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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 385 B

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 889 B

After

Width:  |  Height:  |  Size: 735 B

BIN
qrc/image/icon200.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 580 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -284,3 +284,66 @@ QWidget#FrmUpload > QLabel#labTitle {
font-size: 30px;
}
QProgressBar {
border: 2px solid #3A3A3A;
border-radius: 5px;
background-color: #D3D3D3;
}
QProgressBar::chunk {
background-color: #1E90FF;
border-radius: 3px;
}
QCheckBox {
spacing: 0px;
padding: 0px;
margin: 0px;
}
QCheckBox::indicator {
width: 18px;
height: 18px;
}
QCheckBox::indicator:unchecked {
image: url(:/qrc/image/checkbox_unchecked.png)
}
QCheckBox::indicator:checked {
image: url(:/qrc/image/checkbox_checked.png)
}
QCheckBox::indicator:indeterminate {
image: url(:/qrc/image/checkbox_parcial.png)
}
QComboBox QAbstractItemView {
border-style: none;
border-radius: 10px;
outline: 0;
}
QComboBox QAbstractItemView::item {
padding: 0px;
margin: 0px;
border-style: none;
}
QComboBox QAbstractItemView::item:selected {
padding: 0px;
margin: 0px;
border-style: none;
color: black;
background-color: #F5F7FA;
}
QComboBox QAbstractItemView::item:hover {
padding: 0px;
margin: 0px;
background-color: #F5F7FA;
color: black;
border-style: none;
}

View File

@@ -1,5 +1,8 @@
<RCC>
<qresource prefix="/">
<file>qrc/qss/blacksoft.qss</file>
<file>qrc/image/checkbox_checked.png</file>
<file>qrc/image/checkbox_parcial.png</file>
<file>qrc/image/checkbox_unchecked.png</file>
</qresource>
</RCC>

View File

@@ -1,6 +1,7 @@
#include "widget.h"
#include "ui_widget.h"
#include "tchttpservice.h"
#include "urldatabase.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
@@ -10,6 +11,10 @@ Widget::Widget(QWidget *parent)
initWidgetForm();
initWidget();
initSignalSlot();
initTrayApp();
// QString stdPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
// qDebug() << stdPath;
// ImageManager::instance()->initialize(stdPath + "/picpanel.db");
// this->btnPageUpload->setChecked(true);
// this->btnPageUpload->setStyleSheet("{border: none;border-right: 4px solid #409EFF;color: #409EFF;}");
}
@@ -106,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){
@@ -114,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;
}
}
@@ -127,15 +132,6 @@ bool Widget::eventFilter(QObject *watched, QEvent *event)
void Widget::paintEvent(__attribute__((unused))QPaintEvent *event)
{
// QPainter painter(this);
// painter.setRenderHint(QPainter::Antialiasing);
// painter.setPen(Qt::NoPen);
// painter.setBrush(QColor("#3F3C37"));
// painter.drawRoundedRect(rect(), 15, 15);
// QWidget::paintEvent(event);
QStyleOption opt;
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
opt.init(this);
@@ -161,12 +157,20 @@ void Widget::initWidgetForm()
ui->btnMin->setFlat(true);
ui->btnClose->setFlat(true);
#if _WIN32
IconHelper::setIconFontIndex(2);
#elif __APPLE__
IconHelper::setIconFontIndex(1);
#endif
IconHelper::setIcon(ui->btnMin, QString("F068").toInt(nullptr, 16), 16);
IconHelper::setIcon(ui->btnClose, QString("F00D").toInt(nullptr, 16), 16);
ui->labTitle->setText("PicPanel");
QString version = QString("%1-%2.%3").arg("PicPanel").arg(VERSION_MAJ).arg(VERSION_MIN);
if (VERSION_BATE)
version += "-beta";
ui->labTitle->setText(version);
}
@@ -206,12 +210,15 @@ void Widget::initSignalSlot()
b->installEventFilter(this);
}
connect(TCHttpService::getInstance(), &TCHttpService::signal_loginSuc, this, &Widget::slot_loginSec);
connect(frmupload, &FrmUpload::signal_uploadSuccess, this, &Widget::slot_uploadSuccess);
connect(this, &Widget::signal_updateImage, frmalbum, &FrmAlbum::slot_updateImage);
}
void Widget::initLeftMenu()
{
frmupload = new FrmUpload;
frmalbum = new FrmAlbum;
frmupload = new FrmUpload(this);
frmalbum = new FrmAlbum(this);
frmsetting = new FrmSetting(this);
ui->frmTop->setPalette(QPalette(QColor(63, 60, 55)));
@@ -289,7 +296,45 @@ void Widget::initLeftMenu()
ui->frame->setLayout(frameLayout);
}
void Widget::initTrayApp()
{
trayIcon = new QSystemTrayIcon;
trayIcon->setIcon(QIcon(":/qrc/image/icon.png"));
trayIcon->setToolTip("PicPanel");
QMenu* trayMenu = new QMenu();
QAction* exitAction = new QAction("Exit");
connect(exitAction, &QAction::triggered, qApp, &QApplication::quit);
trayIcon->setContextMenu(trayMenu);
trayIcon->show();
}
void Widget::showNotification(QString title, QString content)
{
qDebug() << "showNotification";
trayIcon->showMessage(title, content, QIcon(":/qrc/image/icon200.png"));
// NOTIFYICONDATA nid = {0};
// nid.cbSize = sizeof(NOTIFYICONDATA);
// // nid.hWnd = (HWND)QGuiApplication::primaryScreen();
// nid.hWnd = reinterpret_cast<HWND>(this->winId());
// nid.uFlags = NIF_INFO | NIF_ICON | NIF_MESSAGE;
// QString iconPath = "./qrc/image/icon.png";
// HICON hIcon = (HICON)LoadImage(NULL, iconPath.toStdWString().c_str(), IMAGE_ICON,
// 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
// nid.hIcon = hIcon;
// std::wstring wtext = content.toStdWString();
// LPCWSTR lpText = wtext.c_str();
// wcscpy_s(nid.szTip, lpText);
// Shell_NotifyIcon(NIM_MODIFY, &nid);
// Shell_NotifyIcon(NIM_ADD, &nid);
// DestroyIcon(hIcon);
}
void Widget::on_btnClose_clicked()
{
@@ -333,6 +378,7 @@ void Widget::pageChangeSlot()
btnPageUpload->setIcon(iconUploadWhite);
btnPageSetting->setIcon(iconSettingWhite);
ui->stackedWidget->setCurrentWidget(frmalbum);
emit signal_updateImage();
}
else {
btn->setIcon(iconSettingBlue);
@@ -369,3 +415,13 @@ void Widget::actPrivateLicSlot()
"4.信息安全<br><br>"
"a)本软件不会收集您的个人信息、密钥信息等隐私信息,所收集的信息仅仅作为改善软件、优化体验、了解软件日活等用途。");
}
void Widget::slot_loginSec()
{
showNotification("登录成功", "登录成功");
}
void Widget::slot_uploadSuccess(QString url)
{
showNotification("上传成功", url);
}

View File

@@ -12,12 +12,21 @@
#include <QEvent>
#include <QPaintEvent>
#include <QMessageBox>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QIcon>
#include "fileconfigdecode.h"
#include "frmalbum.h"
#include "frmsetting.h"
#include "frmupload.h"
#include "iconhelper.h"
#define VERSION_MAJ "2"
#define VERSION_MIN "1"
#define VERSION_BATE 0
class QPushButton;
QT_BEGIN_NAMESPACE
@@ -43,17 +52,23 @@ private slots:
void on_btnClose_clicked();
void on_btnMin_clicked();
private slots:
void pageChangeSlot();
void actAboutSlot();
void actRcodeSlot();
void actPrivateLicSlot();
void slot_loginSec();
public slots:
void slot_uploadSuccess(QString url);
private:
void initWidgetForm();
void initWidget();
void initSignalSlot();
void initLeftMenu();
void initTrayApp();
void showNotification(QString title, QString content);
private:
Ui::Widget *ui;
@@ -71,7 +86,12 @@ private:
QAction* actRcode;
QAction* actPrivateLic;
QSystemTrayIcon* trayIcon;
FileConfigDecode* fileConfig;
signals:
void signal_updateImage();
};
#endif // WIDGET_H

View File

@@ -150,6 +150,9 @@
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QFrame" name="frame">
<property name="sizePolicy">
@@ -166,7 +169,7 @@
</property>
<property name="maximumSize">
<size>
<width>200</width>
<width>180</width>
<height>16777215</height>
</size>
</property>