feat: ISSUE #I67K8Y 新增 spk://search/keyword 链接格式解析

支持打开该链接跳转搜索页面(禁止直接搜索 %,搜索结果过多会导致搜索页面 QtWebEngine 进程崩溃,无法继续搜索)

Log: 支持链接跳转搜索结果页面;暂不支持直接跳转到应用详情页
This commit is contained in:
zty199 2023-01-30 16:15:07 +08:00
parent 1a89c2a1a6
commit 4b40e3caca
5 changed files with 35 additions and 17 deletions

@ -136,7 +136,7 @@ int main(int argc, char *argv[])
QString arg1 = argv[1];
if (arg1.trimmed().startsWith("spk://"))
{
w.openUrl(QUrl(argv[1]));
w.openUrl(arg1);
}
}
w.show();

@ -200,11 +200,18 @@ MainWindow::MainWindow(QWidget *parent)
QString searchtext = searchEdit->text();
if (!searchtext.isEmpty()) {
if (searchtext.startsWith("spk://")) {
openUrl(QUrl(searchtext));
openUrl(searchtext);
searchEdit->clearEdit();
} else {
ui->applistpage_1->getSearchList(searchtext);
switchPage(AppPageSearchlist);
if (searchtext == "%")
{
qWarning() << "keyword '%' matches too many results, which will cause QtWebEngine crash.";
}
else
{
ui->applistpage_1->getSearchList(searchtext);
switchPage(AppPageSearchlist);
}
}
}
this->setFocus(); });
@ -213,11 +220,11 @@ MainWindow::MainWindow(QWidget *parent)
{ downloadButton->setProgress(i); });
// 列表点击事件
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk)
{ openUrl(spk); });
{ openUrl(spk.toString()); });
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk)
{ openUrl(spk); });
{ openUrl(spk.toString()); });
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk)
{ openUrl(spk); });
{ openUrl(spk.toString()); });
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::newProcessInstance, this, &MainWindow::onNewProcessInstance);
@ -246,7 +253,7 @@ void MainWindow::onGetUrl(const QString &url)
{
if (url.trimmed().startsWith("spk://"))
{
openUrl(QUrl(url));
openUrl(url);
}
activateWindow();
}
@ -261,16 +268,27 @@ void MainWindow::onNewProcessInstance(qint64 pid, const QStringList &arguments)
}
}
void MainWindow::openUrl(QUrl url)
void MainWindow::openUrl(const QString &url)
{
if (url.toString().startsWith("spk://"))
if (url.startsWith("spk://search/"))
{
ui->appintopage->openUrl(QUrl(url.toString().replace("+", "%2B")));
QString keyword = url.mid(13);
if (keyword == "%")
{
qWarning() << "keyword '%' is not valid, which will cause QtWebEngine crash.";
return;
}
ui->applistpage_1->getSearchList(keyword);
switchPage(AppPageSearchlist);
}
else if (url.startsWith("spk://"))
{
ui->appintopage->openUrl(QUrl::fromUserInput(url));
switchPage(AppPageAppdetail);
}
else
{
QDesktopServices::openUrl(QUrl(url.toString().replace("+", "%2B")));
QDesktopServices::openUrl(QUrl::fromUserInput(url));
}
}
@ -355,5 +373,5 @@ void MainWindow::on_pushButton_14_clicked()
upgradeP->waitForFinished(-1);
upgradeP->deleteLater(); });
}
}
}
}

@ -31,7 +31,7 @@ public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void openUrl(QUrl);
void openUrl(const QString &url);
private:
void initDbus();

@ -56,7 +56,7 @@ void AppListPage::getAppList(QString type)
delete api;
}
void AppListPage::getSearchList(QString keyword)
void AppListPage::getSearchList(const QString &keyword)
{
isSearch = true;
nowType = keyword;
@ -71,7 +71,7 @@ void AppListPage::getSearchList(QString keyword)
{
theme = "theme=light";
}
url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + keyword + "&" + theme;
url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme;
ui->webEngineView->setUrl(url);
delete api;
}

@ -14,7 +14,7 @@ class AppListPage : public QWidget
public:
void setTheme(bool dark);
void getSearchList(QString keyword);
void getSearchList(const QString &keyword);
void getAppList(QString type);
explicit AppListPage(QWidget *parent = nullptr);
~AppListPage();