mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-03-26 15:29:43 +08:00
4.0
This commit is contained in:
226
src/widgets/common/downloaditem.cpp
Normal file
226
src/widgets/common/downloaditem.cpp
Normal file
@@ -0,0 +1,226 @@
|
||||
#include "downloaditem.h"
|
||||
#include "ui_downloaditem.h"
|
||||
|
||||
#include <QtConcurrent>
|
||||
#include <QProcess>
|
||||
|
||||
bool DownloadItem::isInstall = false;
|
||||
|
||||
DownloadItem::DownloadItem(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
reinstall(false),
|
||||
close(false),
|
||||
ui(new Ui::DownloadItem),
|
||||
menu_install(new QMenu),
|
||||
action_dpkg(new QAction),
|
||||
action_deepin(new QAction),
|
||||
action_gdebi(new QAction),
|
||||
output_w(new DDialog),
|
||||
textbrowser(new QTextBrowser)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
ui->pushButton_install->setEnabled(false);
|
||||
ui->progressBar->setValue(0);
|
||||
ui->label_filename->hide();
|
||||
ui->pushButton_install->hide();
|
||||
ui->pushButton_3->hide();
|
||||
ui->widget_spinner->start();
|
||||
ui->widget_spinner->hide();
|
||||
action_dpkg->setText(tr("Spark Store App Installer"));
|
||||
action_deepin->setText(tr("deepin deb installer"));
|
||||
action_gdebi->setText(tr("gdebi"));
|
||||
|
||||
connect(action_dpkg,&QAction::triggered,[=](){DownloadItem::install(0);});
|
||||
connect(action_deepin,&QAction::triggered,[=](){DownloadItem::install(1);});
|
||||
connect(action_gdebi,&QAction::triggered,[=](){DownloadItem::install(2);});
|
||||
|
||||
// ssinstall 命令存在时再加入该选项
|
||||
QFile ssinstall("/usr/local/bin/ssinstall");
|
||||
ssinstall.open(QIODevice::ReadOnly);
|
||||
if(ssinstall.isOpen())
|
||||
{
|
||||
menu_install->addAction(action_dpkg);
|
||||
}
|
||||
|
||||
// QFile deepin("/usr/bin/deepin-deb-installer");
|
||||
// deepin.open(QIODevice::ReadOnly);
|
||||
// if(deepin.isOpen())
|
||||
// {
|
||||
// menu_install->addAction(action_deepin);
|
||||
// }
|
||||
// QFile gdebi("/usr/bin/gdebi");
|
||||
// gdebi.open(QIODevice::ReadOnly);
|
||||
// if(gdebi.isOpen())
|
||||
// {
|
||||
// menu_install->addAction(action_gdebi);
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
DownloadItem::~DownloadItem()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void DownloadItem::setValue(qint64 value)
|
||||
{
|
||||
ui->progressBar->setValue(qint32(value));
|
||||
ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")");
|
||||
if(ui->label_2->text().left(4) == "100%")
|
||||
{
|
||||
ui->label_2->setText(tr("Downloaded. Open APP Upgrade and Install Settings to enable password-free installation"));
|
||||
}
|
||||
}
|
||||
|
||||
void DownloadItem::setMax(qint64 max)
|
||||
{
|
||||
ui->progressBar->setMaximum(qint32(max));
|
||||
}
|
||||
|
||||
void DownloadItem::setName(QString name)
|
||||
{
|
||||
ui->label->setText(name);
|
||||
}
|
||||
|
||||
QString DownloadItem::getName()
|
||||
{
|
||||
return ui->label_filename->text();
|
||||
}
|
||||
|
||||
void DownloadItem::readyInstall()
|
||||
{
|
||||
if(!close)
|
||||
{
|
||||
ui->progressBar->hide();
|
||||
ui->pushButton_install->setEnabled(true);
|
||||
ui->pushButton_install->show();
|
||||
ui->pushButton_2->hide();
|
||||
}
|
||||
}
|
||||
|
||||
void DownloadItem::setFileName(QString fileName)
|
||||
{
|
||||
ui->label_filename->setText(fileName);
|
||||
}
|
||||
|
||||
void DownloadItem::seticon(const QPixmap icon)
|
||||
{
|
||||
ui->label_3->setPixmap(icon);
|
||||
}
|
||||
|
||||
void DownloadItem::closeDownload()
|
||||
{
|
||||
on_pushButton_2_clicked();
|
||||
}
|
||||
|
||||
void DownloadItem::setSpeed(QString s)
|
||||
{
|
||||
speed = s;
|
||||
}
|
||||
|
||||
void DownloadItem::install(int t)
|
||||
{
|
||||
if(!isInstall)
|
||||
{
|
||||
isInstall = true;
|
||||
ui->pushButton_install->hide();
|
||||
ui->widget_spinner->show();
|
||||
qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8();
|
||||
ui->label_2->setText(tr("Installing"));
|
||||
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
QProcess installer;
|
||||
switch(t)
|
||||
{
|
||||
case 0:
|
||||
installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
case 1:
|
||||
installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
case 2:
|
||||
installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
}
|
||||
|
||||
bool haveError = false;
|
||||
bool notRoot = false;
|
||||
installer.waitForFinished(-1); // 不设置超时
|
||||
out = installer.readAllStandardOutput();
|
||||
|
||||
QStringList everyOut = out.split("\n");
|
||||
for(int i=0;i<everyOut.size();i++)
|
||||
{
|
||||
if(everyOut[i].left(2) == "E:")
|
||||
{
|
||||
haveError = true;
|
||||
}
|
||||
if(everyOut[i].right(14) == "Not authorized")
|
||||
{
|
||||
notRoot = true;
|
||||
}
|
||||
}
|
||||
|
||||
QProcess isInstall;
|
||||
isInstall.start("dpkg -s " + pkgName);
|
||||
isInstall.waitForFinished(180); // 默认超时 3 分钟
|
||||
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||
if(error == 0)
|
||||
{
|
||||
ui->pushButton_install->hide();
|
||||
ui->label_2->setText(tr("Finish"));
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->pushButton_install->show();
|
||||
ui->pushButton_install->setText(tr("Retry"));
|
||||
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
|
||||
if(notRoot)
|
||||
{
|
||||
ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation"));
|
||||
ui->pushButton_install->show();
|
||||
ui->pushButton_3->hide();
|
||||
}
|
||||
|
||||
ui->widget_spinner->hide();
|
||||
DownloadItem::isInstall = false;
|
||||
});
|
||||
|
||||
qDebug()<<ui->label_filename->text().toUtf8();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void DownloadItem::on_pushButton_install_clicked()
|
||||
{
|
||||
// 弹出菜单
|
||||
menu_install->exec(cursor().pos());
|
||||
}
|
||||
|
||||
void DownloadItem::on_pushButton_2_clicked()
|
||||
{
|
||||
ui->label_2->setText(tr("Download canceled"));
|
||||
ui->pushButton_2->setEnabled(false);
|
||||
ui->progressBar->hide();
|
||||
close = true;
|
||||
}
|
||||
|
||||
void DownloadItem::on_pushButton_3_clicked()
|
||||
{
|
||||
textbrowser->setLineWidth(0);
|
||||
textbrowser->setText(out);
|
||||
textbrowser->setMinimumHeight(500);
|
||||
|
||||
output_w->setMinimumHeight(600);
|
||||
output_w->setAttribute(Qt::WA_TranslucentBackground);
|
||||
output_w->setTitle(ui->label->text());
|
||||
output_w->layout()->setMargin(20);
|
||||
output_w->layout()->addWidget(textbrowser);
|
||||
output_w->show();
|
||||
}
|
||||
66
src/widgets/common/downloaditem.h
Normal file
66
src/widgets/common/downloaditem.h
Normal file
@@ -0,0 +1,66 @@
|
||||
#ifndef DOWNLOADITEM_H
|
||||
#define DOWNLOADITEM_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTextBrowser>
|
||||
#include <QMenu>
|
||||
#include <QAction>
|
||||
|
||||
#include <DDialog>
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
namespace Ui {
|
||||
class DownloadItem;
|
||||
}
|
||||
|
||||
class DownloadItem : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DownloadItem(QWidget *parent = nullptr);
|
||||
~DownloadItem();
|
||||
|
||||
int num;
|
||||
bool free;
|
||||
static bool isInstall;
|
||||
bool reinstall;
|
||||
QString speed;
|
||||
QString out;
|
||||
QString pkgName;
|
||||
bool close;
|
||||
|
||||
void setValue(qint64);
|
||||
void setMax(qint64);
|
||||
void setName(QString);
|
||||
QString getName();
|
||||
void readyInstall();
|
||||
|
||||
void setFileName(QString);
|
||||
void seticon(const QPixmap);
|
||||
void closeDownload();
|
||||
void setSpeed(QString);
|
||||
|
||||
void install(int);
|
||||
|
||||
private:
|
||||
Ui::DownloadItem *ui;
|
||||
|
||||
QMenu *menu_install;
|
||||
QAction *action_dpkg;
|
||||
QAction *action_deepin;
|
||||
QAction *action_gdebi;
|
||||
|
||||
DDialog *output_w;
|
||||
QTextBrowser *textbrowser;
|
||||
|
||||
private slots:
|
||||
void on_pushButton_install_clicked();
|
||||
void on_pushButton_2_clicked();
|
||||
void on_pushButton_3_clicked();
|
||||
|
||||
signals:
|
||||
void finished();
|
||||
};
|
||||
|
||||
#endif // DOWNLOADITEM_H
|
||||
294
src/widgets/common/downloaditem.ui
Normal file
294
src/widgets/common/downloaditem.ui
Normal file
@@ -0,0 +1,294 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>DownloadItem</class>
|
||||
<widget class="QWidget" name="DownloadItem">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>666</width>
|
||||
<height>54</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>54</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="spacing">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>icon</string>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_filename">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Name</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>280</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>500</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="spacing">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QProgressBar" name="progressBar">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>500</width>
|
||||
<height>10</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>24</number>
|
||||
</property>
|
||||
<property name="textVisible">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>9</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Waiting to download</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="DSpinner" name="widget_spinner" native="true">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>30</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_install">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Install</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_2">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Cancel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_3">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Info</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>DSpinner</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">dspinner.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
25
src/widgets/common/smoothlistwidget.cpp
Normal file
25
src/widgets/common/smoothlistwidget.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "smoothlistwidget.h"
|
||||
#include <QVBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QWheelEvent>
|
||||
#include <QDebug>
|
||||
SmoothListWidget::SmoothListWidget(QWidget *parent) : QListWidget(parent)
|
||||
{
|
||||
vScrollBar->setOrientation(Qt::Orientation::Vertical); //将滚动条设置为纵向
|
||||
setVerticalScrollBar(vScrollBar); //设置纵向滚动条
|
||||
connect(vScrollBar, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int)));
|
||||
}
|
||||
void SmoothListWidget::wheelEvent(QWheelEvent *e)
|
||||
{
|
||||
//当捕获到事件后,调用相对滚动的槽函数
|
||||
vScrollBar->scroll(e->angleDelta().y());
|
||||
}
|
||||
void SmoothListWidget::onSliderChanged(int p)
|
||||
{
|
||||
int startRow = count();
|
||||
if (p == vScrollBar->maximum())
|
||||
{
|
||||
emit reachedBottom(); // 1
|
||||
}
|
||||
emit msliderChanged(p); // 2
|
||||
}
|
||||
24
src/widgets/common/smoothlistwidget.h
Normal file
24
src/widgets/common/smoothlistwidget.h
Normal file
@@ -0,0 +1,24 @@
|
||||
#ifndef SMOOTHLISTWIDGET_H
|
||||
#define SMOOTHLISTWIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QPushButton>
|
||||
#include <QListWidget>
|
||||
#include "smoothscrollbar.h"
|
||||
class SmoothListWidget: public QListWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SmoothListWidget(QWidget *parent = nullptr);
|
||||
SmoothScrollBar* vScrollBar=new SmoothScrollBar(); //纵向滚动条
|
||||
private:
|
||||
void wheelEvent(QWheelEvent* e); //捕获鼠标滚轮事件
|
||||
signals:
|
||||
void msliderChanged(int p);
|
||||
void reachedBottom();
|
||||
|
||||
private slots:
|
||||
void onSliderChanged(int p);
|
||||
};
|
||||
|
||||
#endif // SMOOTHLISTWIDGET_H
|
||||
56
src/widgets/common/smoothscrollbar.cpp
Normal file
56
src/widgets/common/smoothscrollbar.cpp
Normal file
@@ -0,0 +1,56 @@
|
||||
#include "smoothscrollbar.h"
|
||||
#include <QWheelEvent>
|
||||
#include <QDebug>
|
||||
SmoothScrollBar::SmoothScrollBar(QWidget* parent):QScrollBar(parent)
|
||||
{
|
||||
m_scrollAni=new QPropertyAnimation(this);
|
||||
m_scrollAni->setTargetObject(this);
|
||||
m_scrollAni->setPropertyName("value");
|
||||
m_scrollAni->setEasingCurve(QEasingCurve::OutQuint); //设置动画曲线,在Qt文档中有详细的介绍
|
||||
m_scrollAni->setDuration(500); //设置动画时间,数值越小播放越快
|
||||
m_targetValue_v=value(); //将m_targetValue_v初始化
|
||||
}
|
||||
|
||||
void SmoothScrollBar::setValue(int value)
|
||||
{
|
||||
m_scrollAni->stop();//停止现在的动画,防止出现冲突
|
||||
m_scrollAni->setStartValue(this->value()); //设置动画滚动的初始值为当前位置
|
||||
m_scrollAni->setEndValue(value); //设置动画的结束位置为目标值
|
||||
m_scrollAni->start(); //开始动画
|
||||
}
|
||||
void SmoothScrollBar::scrollTop()
|
||||
{
|
||||
setValue(-m_targetValue_v); //开始动画
|
||||
m_targetValue_v=0;
|
||||
}
|
||||
void SmoothScrollBar::scroll(int value)
|
||||
{
|
||||
//这里推荐评论区中大佬优化的写法
|
||||
if(m_targetValue_v-value>=0)
|
||||
{
|
||||
m_targetValue_v-=value; //将目标值和相对位置进行运算
|
||||
setValue(m_targetValue_v); //开始动画
|
||||
}
|
||||
}
|
||||
|
||||
void SmoothScrollBar::mousePressEvent(QMouseEvent *e)
|
||||
{
|
||||
//当使用鼠标操作滚动条时,不会刷新m_targetValue_v的值,因而需要重写事件,对其进行刷新。
|
||||
m_scrollAni->stop();
|
||||
QScrollBar::mousePressEvent(e);
|
||||
m_targetValue_v=value();
|
||||
}
|
||||
|
||||
void SmoothScrollBar::mouseReleaseEvent(QMouseEvent *e)
|
||||
{
|
||||
m_scrollAni->stop();
|
||||
QScrollBar::mouseReleaseEvent(e);
|
||||
m_targetValue_v=value();
|
||||
}
|
||||
|
||||
void SmoothScrollBar::mouseMoveEvent(QMouseEvent *e)
|
||||
{
|
||||
m_scrollAni->stop();
|
||||
QScrollBar::mouseMoveEvent(e);
|
||||
m_targetValue_v=value();
|
||||
}
|
||||
27
src/widgets/common/smoothscrollbar.h
Normal file
27
src/widgets/common/smoothscrollbar.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef SMOOTHSCROLLBAR_H
|
||||
#define SMOOTHSCROLLBAR_H
|
||||
|
||||
#include <QScrollBar>
|
||||
#include <QPropertyAnimation>
|
||||
class SmoothScrollBar : public QScrollBar
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SmoothScrollBar(QWidget *parent=nullptr);
|
||||
private:
|
||||
//这里重写鼠标事件的目的是在手动点击或拖动滚动条时更新m_targetValue_v变量,并且在拖动时立即结束滚动的动画。
|
||||
//这里如果不明白作用,可以先注释掉看看手动拖动滚动条时对动画有什么影响。
|
||||
void mousePressEvent(QMouseEvent *) override;
|
||||
void mouseReleaseEvent(QMouseEvent *) override;
|
||||
void mouseMoveEvent(QMouseEvent *) override;
|
||||
|
||||
QPropertyAnimation *m_scrollAni; //用来实现动画
|
||||
int m_targetValue_v; //用来记录目标位置的变量
|
||||
public slots:
|
||||
void scrollTop();
|
||||
void setValue(int value); //重写的setValue槽函数,实现动画效果
|
||||
void scroll(int value); //新增相对滚动的槽函数,value为滚动距离的矢量表示
|
||||
signals:
|
||||
};
|
||||
|
||||
#endif // SMOOTHSCROLLBAR_H
|
||||
44
src/widgets/common/webenginepage.cpp
Normal file
44
src/widgets/common/webenginepage.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
#include "webenginepage.h"
|
||||
|
||||
#include <QDesktopServices>
|
||||
|
||||
WebEnginePage::WebEnginePage(QObject *parent)
|
||||
: QWebEnginePage(parent)
|
||||
{
|
||||
}
|
||||
|
||||
WebEnginePage::~WebEnginePage()
|
||||
{
|
||||
}
|
||||
|
||||
void WebEnginePage::setUrl(const QUrl &url)
|
||||
{
|
||||
if (m_currentUrl == url) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_currentUrl = url;
|
||||
QWebEnginePage::setUrl(url);
|
||||
}
|
||||
|
||||
QWebEnginePage *WebEnginePage::createWindow(QWebEnginePage::WebWindowType type)
|
||||
{
|
||||
Q_UNUSED(type)
|
||||
|
||||
WebEnginePage *page = new WebEnginePage(parent());
|
||||
connect(page, &WebEnginePage::urlChanged, this, &WebEnginePage::slotUrlChanged);
|
||||
return page;
|
||||
}
|
||||
|
||||
void WebEnginePage::slotUrlChanged(const QUrl &url)
|
||||
{
|
||||
if (m_currentUrl == url) {
|
||||
sender()->deleteLater();
|
||||
return;
|
||||
}
|
||||
|
||||
qDebug() << Q_FUNC_INFO << m_currentUrl << url;
|
||||
|
||||
QDesktopServices::openUrl(url);
|
||||
sender()->deleteLater();
|
||||
}
|
||||
26
src/widgets/common/webenginepage.h
Normal file
26
src/widgets/common/webenginepage.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef WEBENGINEPAGE_H
|
||||
#define WEBENGINEPAGE_H
|
||||
|
||||
#include <QWebEnginePage>
|
||||
|
||||
class WebEnginePage : public QWebEnginePage
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit WebEnginePage(QObject *parent = nullptr);
|
||||
~WebEnginePage() override;
|
||||
|
||||
void setUrl(const QUrl &url);
|
||||
|
||||
protected:
|
||||
QWebEnginePage *createWindow(WebWindowType type) override;
|
||||
|
||||
private slots:
|
||||
void slotUrlChanged(const QUrl &url);
|
||||
|
||||
private:
|
||||
QUrl m_currentUrl;
|
||||
};
|
||||
|
||||
#endif // WEBENGINEPAGE_H
|
||||
10
src/widgets/common/webengineview.cpp
Normal file
10
src/widgets/common/webengineview.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
#include "webengineview.h"
|
||||
#include "webenginepage.h"
|
||||
|
||||
#include <QDesktopServices>
|
||||
|
||||
WebEngineView::WebEngineView(QWidget *parent)
|
||||
: QWebEngineView(parent)
|
||||
{
|
||||
setPage(new WebEnginePage(this));
|
||||
}
|
||||
14
src/widgets/common/webengineview.h
Normal file
14
src/widgets/common/webengineview.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef WEBENGINEVIEW_H
|
||||
#define WEBENGINEVIEW_H
|
||||
|
||||
#include <QWebEngineView>
|
||||
|
||||
class WebEngineView : public QWebEngineView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit WebEngineView(QWidget *parent = nullptr);
|
||||
};
|
||||
|
||||
#endif // WEBENGINEVIEW_H
|
||||
Reference in New Issue
Block a user