mirror of
https://gitee.com/spark-store-project/spark-store
synced 2025-12-14 21:02:04 +08:00
feat:添加复选框让用户选择指定软件更新
This commit is contained in:
@@ -51,6 +51,24 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
|
|||||||
else
|
else
|
||||||
painter->fillRect(option.rect, QColor("#F3F4F6"));
|
painter->fillRect(option.rect, QColor("#F3F4F6"));
|
||||||
|
|
||||||
|
// 绘制复选框
|
||||||
|
QString packageName = index.data(Qt::UserRole + 1).toString();
|
||||||
|
bool isSelected = m_selectedPackages.contains(packageName);
|
||||||
|
|
||||||
|
QRect checkboxRect(option.rect.left() + 10, option.rect.top() + (option.rect.height() - 20) / 2, 20, 20);
|
||||||
|
|
||||||
|
// 绘制复选框边框
|
||||||
|
painter->setPen(QColor("#888888"));
|
||||||
|
painter->setBrush(Qt::NoBrush);
|
||||||
|
painter->drawRect(checkboxRect);
|
||||||
|
|
||||||
|
// 如果选中,绘制勾选标记
|
||||||
|
if (isSelected) {
|
||||||
|
painter->setPen(QPen(QColor("#2563EB"), 2));
|
||||||
|
painter->setBrush(QColor("#2563EB"));
|
||||||
|
painter->drawRect(checkboxRect.adjusted(4, 4, -4, -4));
|
||||||
|
}
|
||||||
|
|
||||||
QFont boldFont = option.font;
|
QFont boldFont = option.font;
|
||||||
boldFont.setBold(true);
|
boldFont.setBold(true);
|
||||||
QFont normalFont = option.font;
|
QFont normalFont = option.font;
|
||||||
@@ -65,7 +83,8 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
|
|||||||
QRect rect = option.rect;
|
QRect rect = option.rect;
|
||||||
int margin = 10, spacing = 6, iconSize = 40;
|
int margin = 10, spacing = 6, iconSize = 40;
|
||||||
|
|
||||||
QRect iconRect(rect.left() + margin, rect.top() + (rect.height() - iconSize) / 2, iconSize, iconSize);
|
// 调整图标位置,为复选框留出空间
|
||||||
|
QRect iconRect(rect.left() + 40, rect.top() + (rect.height() - iconSize) / 2, iconSize, iconSize);
|
||||||
QIcon(iconPath).paint(painter, iconRect);
|
QIcon(iconPath).paint(painter, iconRect);
|
||||||
|
|
||||||
int textX = iconRect.right() + margin;
|
int textX = iconRect.right() + margin;
|
||||||
@@ -88,7 +107,6 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
|
|||||||
painter->drawText(descRect, Qt::TextWordWrap,
|
painter->drawText(descRect, Qt::TextWordWrap,
|
||||||
QString("包大小:%1 MB").arg(QString::number(size.toDouble() / (1024 * 1024), 'f', 2)));
|
QString("包大小:%1 MB").arg(QString::number(size.toDouble() / (1024 * 1024), 'f', 2)));
|
||||||
|
|
||||||
QString packageName = index.data(Qt::UserRole + 1).toString();
|
|
||||||
bool isDownloading = m_downloads.contains(packageName) && m_downloads[packageName].isDownloading;
|
bool isDownloading = m_downloads.contains(packageName) && m_downloads[packageName].isDownloading;
|
||||||
int progress = m_downloads.value(packageName, DownloadInfo{0, false}).progress;
|
int progress = m_downloads.value(packageName, DownloadInfo{0, false}).progress;
|
||||||
bool isInstalled = m_downloads.value(packageName).isInstalled;
|
bool isInstalled = m_downloads.value(packageName).isInstalled;
|
||||||
@@ -162,6 +180,18 @@ bool AppDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
|
|||||||
QRect rect = option.rect;
|
QRect rect = option.rect;
|
||||||
QString packageName = index.data(Qt::UserRole + 1).toString();
|
QString packageName = index.data(Qt::UserRole + 1).toString();
|
||||||
|
|
||||||
|
// 检查是否点击了复选框
|
||||||
|
QRect checkboxRect(rect.left() + 10, rect.top() + (rect.height() - 20) / 2, 20, 20);
|
||||||
|
if (checkboxRect.contains(mouseEvent->pos())) {
|
||||||
|
if (m_selectedPackages.contains(packageName)) {
|
||||||
|
m_selectedPackages.remove(packageName);
|
||||||
|
} else {
|
||||||
|
m_selectedPackages.insert(packageName);
|
||||||
|
}
|
||||||
|
emit updateDisplay(packageName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_downloads.contains(packageName) && m_downloads[packageName].isDownloading) {
|
if (m_downloads.contains(packageName) && m_downloads[packageName].isDownloading) {
|
||||||
QRect cancelButtonRect(rect.right() - 70, rect.top() + (rect.height() - 20) / 2, 60, 20);
|
QRect cancelButtonRect(rect.right() - 70, rect.top() + (rect.height() - 20) / 2, 60, 20);
|
||||||
if (cancelButtonRect.contains(mouseEvent->pos())) {
|
if (cancelButtonRect.contains(mouseEvent->pos())) {
|
||||||
@@ -321,3 +351,36 @@ void AppDelegate::updateSpinner() {
|
|||||||
m_spinnerAngle = (m_spinnerAngle + 10) % 360; // 每次增加10度
|
m_spinnerAngle = (m_spinnerAngle + 10) % 360; // 每次增加10度
|
||||||
emit updateDisplay(m_installingPackage); // 仅刷新当前正在安装的项
|
emit updateDisplay(m_installingPackage); // 仅刷新当前正在安装的项
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 新增:更新选中应用的方法
|
||||||
|
void AppDelegate::startDownloadForSelected() {
|
||||||
|
if (!m_model) return;
|
||||||
|
for (int row = 0; row < m_model->rowCount(); ++row) {
|
||||||
|
QModelIndex index = m_model->index(row, 0);
|
||||||
|
QString packageName = index.data(Qt::UserRole + 1).toString();
|
||||||
|
|
||||||
|
// 只下载选中的应用
|
||||||
|
if (m_selectedPackages.contains(packageName)) {
|
||||||
|
if (m_downloads.contains(packageName) && (m_downloads[packageName].isDownloading || m_downloads[packageName].isInstalled))
|
||||||
|
continue;
|
||||||
|
QString downloadUrl = index.data(Qt::UserRole + 7).toString();
|
||||||
|
QString outputPath = QString("%1/%2.metalink").arg(QDir::tempPath(), packageName);
|
||||||
|
m_downloads[packageName] = {0, true, false};
|
||||||
|
m_downloadManager->startDownload(packageName, downloadUrl, outputPath);
|
||||||
|
emit updateDisplay(packageName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 复选框相关方法实现
|
||||||
|
void AppDelegate::setSelectedPackages(const QSet<QString> &selected) {
|
||||||
|
m_selectedPackages = selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSet<QString> AppDelegate::getSelectedPackages() const {
|
||||||
|
return m_selectedPackages;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppDelegate::clearSelection() {
|
||||||
|
m_selectedPackages.clear();
|
||||||
|
}
|
||||||
@@ -28,6 +28,12 @@ public:
|
|||||||
bool editorEvent(QEvent *event, QAbstractItemModel *model,
|
bool editorEvent(QEvent *event, QAbstractItemModel *model,
|
||||||
const QStyleOptionViewItem &option, const QModelIndex &index) override;
|
const QStyleOptionViewItem &option, const QModelIndex &index) override;
|
||||||
void startDownloadForAll();
|
void startDownloadForAll();
|
||||||
|
void startDownloadForSelected();
|
||||||
|
|
||||||
|
// 复选框相关方法
|
||||||
|
void setSelectedPackages(const QSet<QString> &selected);
|
||||||
|
QSet<QString> getSelectedPackages() const;
|
||||||
|
void clearSelection();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void updateDisplay(const QString &packageName);
|
void updateDisplay(const QString &packageName);
|
||||||
@@ -41,6 +47,9 @@ private:
|
|||||||
QHash<QString, DownloadInfo> m_downloads;
|
QHash<QString, DownloadInfo> m_downloads;
|
||||||
QAbstractItemModel *m_model = nullptr;
|
QAbstractItemModel *m_model = nullptr;
|
||||||
|
|
||||||
|
// 复选框相关成员变量
|
||||||
|
QSet<QString> m_selectedPackages;
|
||||||
|
|
||||||
QQueue<QString> m_installQueue;
|
QQueue<QString> m_installQueue;
|
||||||
bool m_isInstalling = false;
|
bool m_isInstalling = false;
|
||||||
QProcess *m_installProcess = nullptr;
|
QProcess *m_installProcess = nullptr;
|
||||||
|
|||||||
@@ -55,10 +55,21 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
|
|
||||||
// 新增:点击“更新全部”按钮批量下载
|
// 新增:点击“更新全部”按钮批量下载
|
||||||
connect(ui->updatePushButton, &QPushButton::clicked, this, [=](){
|
connect(ui->updatePushButton, &QPushButton::clicked, this, [=](){
|
||||||
qDebug()<<"更新全部按钮被点击";
|
qDebug()<<"更新按钮被点击";
|
||||||
|
if (m_delegate->getSelectedPackages().isEmpty()) {
|
||||||
|
// 没有选中任何应用,更新全部
|
||||||
m_delegate->startDownloadForAll();
|
m_delegate->startDownloadForAll();
|
||||||
|
} else {
|
||||||
|
// 有选中应用,更新选中
|
||||||
|
m_delegate->startDownloadForSelected();
|
||||||
|
m_delegate->clearSelection();
|
||||||
|
updateButtonText();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 新增:监听选择变化
|
||||||
|
connect(m_delegate, &AppDelegate::updateDisplay, this, &MainWindow::handleSelectionChanged);
|
||||||
|
|
||||||
checkUpdates();
|
checkUpdates();
|
||||||
// 新增:监听搜索框文本变化
|
// 新增:监听搜索框文本变化
|
||||||
connect(ui->searchPlainTextEdit, &QPlainTextEdit::textChanged, this, [=]() {
|
connect(ui->searchPlainTextEdit, &QPlainTextEdit::textChanged, this, [=]() {
|
||||||
@@ -284,3 +295,18 @@ MainWindow::~MainWindow()
|
|||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 新增:更新按钮文本
|
||||||
|
void MainWindow::updateButtonText() {
|
||||||
|
int selectedCount = m_delegate->getSelectedPackages().size();
|
||||||
|
if (selectedCount > 0) {
|
||||||
|
ui->updatePushButton->setText(QString("更新选中(%1)").arg(selectedCount));
|
||||||
|
} else {
|
||||||
|
ui->updatePushButton->setText("更新全部");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增:处理选择变化
|
||||||
|
void MainWindow::handleSelectionChanged() {
|
||||||
|
updateButtonText();
|
||||||
|
}
|
||||||
@@ -35,8 +35,10 @@ private:
|
|||||||
QListView *listView; // 声明 QListView 指针
|
QListView *listView; // 声明 QListView 指针
|
||||||
QJsonArray m_allApps; // 新增:保存所有应用数据
|
QJsonArray m_allApps; // 新增:保存所有应用数据
|
||||||
void filterAppsByKeyword(const QString &keyword); // 新增:搜索过滤函数声明
|
void filterAppsByKeyword(const QString &keyword); // 新增:搜索过滤函数声明
|
||||||
|
void updateButtonText(); // 新增:更新按钮文本
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void handleUpdateFinished(bool success); // 新增:处理更新完成的槽函数
|
void handleUpdateFinished(bool success); // 新增:处理更新完成的槽函数
|
||||||
|
void handleSelectionChanged(); // 新增:处理选择变化的槽函数
|
||||||
};
|
};
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
Reference in New Issue
Block a user