实现应用安装以及对话框显示安装结果的功能

This commit is contained in:
gfdgd xi 2024-01-29 10:32:19 +08:00
parent 6d8e706e39
commit 72233f07ed
7 changed files with 92 additions and 11 deletions

@ -15,6 +15,10 @@ void InstallDEB::AddCommand(QString command){
this->commandList.append(command); this->commandList.append(command);
} }
void InstallDEB::SetCommandAfterRootRun(QString command){
commandAfterRootRun = command;
}
void InstallDEB::RunCommand(bool withRoot){ void InstallDEB::RunCommand(bool withRoot){
this->terminal->setEnabled(true); this->terminal->setEnabled(true);
this->runStatus = true; this->runStatus = true;
@ -24,6 +28,7 @@ void InstallDEB::RunCommand(bool withRoot){
for(int i = 0; i < this->commandList.size(); i++){ for(int i = 0; i < this->commandList.size(); i++){
commandCode += this->commandList.at(i) + "\n"; commandCode += this->commandList.at(i) + "\n";
} }
commandCode += "rm -rfv '" + bashPath + "'"; commandCode += "rm -rfv '" + bashPath + "'";
QFile file(bashPath); QFile file(bashPath);
file.open(QFile::WriteOnly); file.open(QFile::WriteOnly);
@ -35,21 +40,35 @@ void InstallDEB::RunCommand(bool withRoot){
system(("chmod +x '" + bashPath + "'").toUtf8()); // 赋予运行权限 system(("chmod +x '" + bashPath + "'").toUtf8()); // 赋予运行权限
this->terminal->setColorScheme("DarkPastels"); this->terminal->setColorScheme("DarkPastels");
if(withRoot){ if(withRoot){
this->terminal->setShellProgram("/usr/bin/pkexec"); QString bashMainPath = "/tmp/deepin-wine-runner-aptss-installer-root-" + QString::number(QDateTime::currentMSecsSinceEpoch()) + ".sh";
this->terminal->setArgs(QStringList() << "/usr/bin/bash" << bashPath); QString commandCode = "#!/bin/bash\n"\
"pkexec env DISPLAY=$DISPLAY bash '" + bashPath + "'\n" +
this->commandAfterRootRun +
"\nrm -rfv '" + bashMainPath + "'\n"
"rm -rfv '" + bashPath + "'";
QFile file(bashMainPath);
file.open(QFile::WriteOnly);
if(!file.isWritable()){
throw "Can't write the file!";
}
file.write(commandCode.toUtf8());
file.close();
system(("chmod +x '" + bashMainPath + "'").toUtf8()); // 赋予运行权限
this->terminal->setShellProgram("/usr/bin/bash");
this->terminal->setArgs(QStringList() << bashMainPath);
} }
else{ else{
this->terminal->setShellProgram("/usr/bin/bash"); this->terminal->setShellProgram("/usr/bin/bash");
this->terminal->setArgs(QStringList() << bashPath); this->terminal->setArgs(QStringList() << bashPath);
} }
//this->terminal->setAutoClose(1); //this->terminal->setAutoClose(1);
this->terminal->setAutoFillBackground(1); //this->terminal->setAutoFillBackground(1);
QObject::connect(this->terminal, &QTermWidget::finished, this->mainWindow, [this](){ /*QObject::connect(this->terminal, &QTermWidget::finished, this->mainWindow, [this](){
//QMessageBox::information(this->mainWindow, "A", "B");
MessageBox *message = new MessageBox(); MessageBox *message = new MessageBox();
message->information("提示", "应用安装完成"); message->information("提示", "应用安装完成");
this->mainWindow->sendMessage(QIcon(":/Icon/MessageBox/dialog-information.svg"), "应用安装完成"); this->mainWindow->sendMessage(QIcon(":/Icon/MessageBox/dialog-information.svg"), "应用安装完成");
}); });*/
this->terminal->startShellProgram(); this->terminal->startShellProgram();
} }

@ -12,9 +12,11 @@ public:
InstallDEB(QTermWidget *terminal, DMainWindow *mainWindow = NULL); InstallDEB(QTermWidget *terminal, DMainWindow *mainWindow = NULL);
void AddCommand(QString command); void AddCommand(QString command);
void RunCommand(bool withRoot=false); void RunCommand(bool withRoot=false);
void SetCommandAfterRootRun(QString command);
QStringList commandList; QStringList commandList;
private: private:
QTermWidget *terminal; QTermWidget *terminal;
QString commandAfterRootRun;
DMainWindow *mainWindow = NULL; DMainWindow *mainWindow = NULL;
bool runStatus; bool runStatus;
}; };

@ -6,6 +6,7 @@
#include <DMessageBox> #include <DMessageBox>
#include <iostream> #include <iostream>
#include <DApplicationSettings> #include <DApplicationSettings>
#include "messagebox.h"
DWIDGET_USE_NAMESPACE DWIDGET_USE_NAMESPACE
using namespace std; using namespace std;
@ -28,15 +29,36 @@ int main(int argc, char *argv[])
a.setApplicationDescription("Wine运行器是一个能让Linux用户更加方便地运行Windows应用的程序。原版的 Wine 只能使用命令操作且安装过程较为繁琐对小白不友好。于是该运行器为了解决该痛点内置了对Wine图形化的支持、Wine 安装器、微型应用商店、各种Wine工具、自制的Wine程序打包器、运行库安装工具等。"); a.setApplicationDescription("Wine运行器是一个能让Linux用户更加方便地运行Windows应用的程序。原版的 Wine 只能使用命令操作且安装过程较为繁琐对小白不友好。于是该运行器为了解决该痛点内置了对Wine图形化的支持、Wine 安装器、微型应用商店、各种Wine工具、自制的Wine程序打包器、运行库安装工具等。");
a.setApplicationVersion("3.6.1"); a.setApplicationVersion("3.6.1");
a.setProductIcon(QIcon(":/Icon/deepin-wine-runner.svg")); a.setProductIcon(QIcon(":/Icon/deepin-wine-runner.svg"));
a.setProductName("aptss 安装器"); a.setProductName("aptss 应用安装器");
a.setApplicationHomePage("https://gitee.com/gfdgd-xi/deep-wine-runner"); a.setApplicationHomePage("https://gitee.com/gfdgd-xi/deep-wine-runner");
//DApplication::setApplicationHomePage("https://gitee.com/gfdgd-xi/deep-wine-runner"); //DApplication::setApplicationHomePage("https://gitee.com/gfdgd-xi/deep-wine-runner");
DApplication::setOrganizationName("gfdgd_xi"); DApplication::setOrganizationName("gfdgd_xi");
DApplication::setApplicationName("deepin-wine-runner-aptss-installer"); DApplication::setApplicationName("deepin-wine-runner-aptss-installer");
if(argc > 0){
// 用于显示对话框
qDebug() << argv[1];
if(QString(argv[1]) == "--messagebox-information"){
if(argc < 4){
qDebug() << "参数有误!";
return 1;
}
MessageBox().information(argv[2], argv[3]);
return a.exec();
}
if(QString(argv[1]) == "--messagebox-error"){
if(argc < 4){
qDebug() << "参数有误!";
return 1;
}
MessageBox().critical(argv[2], argv[3]);
return a.exec();
}
}
if(system("which aptss")){ if(system("which aptss")){
DMessageBox::information(NULL, "错误", "无法检测到 aptss\n请确保您已安装星火应用商店并更新至最新版本"); MessageBox().critical("错误", "无法检测到 aptss\n请确保您已安装星火应用商店并更新至最新版本");
a.exec();
return 1; return 1;
} }

@ -8,6 +8,7 @@
#include <DTitlebar> #include <DTitlebar>
#include <QDesktopServices> #include <QDesktopServices>
#include <DApplication> #include <DApplication>
#include <DFileDialog>
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: DMainWindow(parent) : DMainWindow(parent)
@ -16,7 +17,7 @@ MainWindow::MainWindow(QWidget *parent)
ui->setupUi(this); ui->setupUi(this);
// 自定义标题栏 // 自定义标题栏
DTitlebar *bar = this->titlebar(); DTitlebar *bar = this->titlebar();
bar->setTitle("应用安装器"); bar->setTitle("aptss 应用安装器");
bar->setIcon(QIcon(":/Icon/deepin-wine-runner.svg")); bar->setIcon(QIcon(":/Icon/deepin-wine-runner.svg"));
bar->setBackgroundTransparent(true); bar->setBackgroundTransparent(true);
QMenu *openProgramWebsite = bar->menu()->addMenu("项目地址"); QMenu *openProgramWebsite = bar->menu()->addMenu("项目地址");
@ -61,10 +62,25 @@ void MainWindow::on_installPath_clicked()
return; return;
} }
InstallDEB *deb = new InstallDEB(terminal, this); InstallDEB *deb = new InstallDEB(terminal, this);
deb->AddCommand("set -e");
deb->AddCommand("aptss update"); deb->AddCommand("aptss update");
deb->AddCommand("aptss install \"" + ui->debPath->text() + "\" -y"); deb->AddCommand("aptss install \"" + ui->debPath->text() + "\" -y");
deb->SetCommandAfterRootRun("if [[ $? != 0 ]]; then \n"\
" '" + QCoreApplication::applicationFilePath() + "' --messagebox-error 错误 安装失败! > /dev/null 2>&1 \n"\
"else \n"
" '" + QCoreApplication::applicationFilePath() + "' --messagebox-information 提示 安装完成! > /dev/null 2>&1 \n"\
"fi");
deb->RunCommand(1); deb->RunCommand(1);
} }
void MainWindow::on_browserButton_clicked()
{
QString filePath = DFileDialog::getOpenFileName(this, "选择 deb 包", QDir::homePath(), "deb 包(*.deb);;所有文件(*.*)");
if(filePath != ""){
ui->debPath->setText(filePath);
}
}

@ -19,6 +19,8 @@ public:
private slots: private slots:
void on_installPath_clicked(); void on_installPath_clicked();
void on_browserButton_clicked();
private: private:
QTermWidget *terminal = new QTermWidget(0); QTermWidget *terminal = new QTermWidget(0);
Ui::MainWindow *ui; Ui::MainWindow *ui;

@ -11,7 +11,7 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>MainWindow</string> <string>aptss 应用安装器</string>
</property> </property>
<property name="windowIcon"> <property name="windowIcon">
<iconset resource="Resources.qrc"> <iconset resource="Resources.qrc">

@ -3,6 +3,7 @@
#include <DLabel> #include <DLabel>
#include <DPushButton> #include <DPushButton>
#include <DTitlebar> #include <DTitlebar>
#include <QScreen>
MessageBox::MessageBox(DWidget *parent){ MessageBox::MessageBox(DWidget *parent){
@ -37,6 +38,25 @@ void MessageBox::ShowMessageBox(QString iconPath, QString title, QString text){
messageBox->resize(messageBox->frameSize().width(), messageBox->frameSize().height()); messageBox->resize(messageBox->frameSize().width(), messageBox->frameSize().height());
//// 根据窗口信息获取中点 //// 根据窗口信息获取中点
if(this->parent == NULL){
/// 如果没有传入窗口
// 获取主屏幕信息
int screenWidth = QGuiApplication::primaryScreen()->geometry().width();
int screenHeight = QGuiApplication::primaryScreen()->geometry().height();
// 获取对话框信息
int messageBoxWidth = messageBox->frameSize().width();
int messageBoxHeight = messageBox->frameSize().height();
// 计算坐标
int x = (screenWidth / 2) - (messageBoxWidth / 2);
int y = (screenHeight / 2) - (messageBoxHeight / 2);
messageBox->move(x, y);
qDebug() << screenWidth;
qDebug() << screenHeight;
qDebug() << messageBoxWidth;
qDebug() << messageBoxHeight;
qDebug() << x << y;
return;
}
// 获取窗口信息 // 获取窗口信息
int parentWindowX = this->parent->frameGeometry().x(); int parentWindowX = this->parent->frameGeometry().x();
int parentWindowY = this->parent->frameGeometry().y(); int parentWindowY = this->parent->frameGeometry().y();
@ -44,7 +64,7 @@ void MessageBox::ShowMessageBox(QString iconPath, QString title, QString text){
int parentWindowHeight = this->parent->frameGeometry().height(); int parentWindowHeight = this->parent->frameGeometry().height();
int messageBoxWidth = messageBox->frameSize().width(); int messageBoxWidth = messageBox->frameSize().width();
int messageBoxHeight = messageBox->frameSize().height(); int messageBoxHeight = messageBox->frameSize().height();
// 计算 X 坐标 // 计算坐标
int x = parentWindowX + ((parentWindowWidth / 2) - (messageBoxWidth / 2)); int x = parentWindowX + ((parentWindowWidth / 2) - (messageBoxWidth / 2));
int y = parentWindowY + ((parentWindowHeight / 2) - (messageBoxHeight / 2)); int y = parentWindowY + ((parentWindowHeight / 2) - (messageBoxHeight / 2));
messageBox->move(x, y); messageBox->move(x, y);