mirror of
https://gitee.com/gfdgd-xi/deep-wine-runner
synced 2025-06-03 21:59:51 +08:00
实现应用安装以及对话框显示安装结果的功能
This commit is contained in:
parent
6d8e706e39
commit
72233f07ed
@ -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;
|
||||||
};
|
};
|
||||||
|
26
main.cpp
26
main.cpp
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user