2024-01-16 22:18:09 +08:00

585 lines
27 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwindow.h"
#include <QGridLayout>
#include <QLabel>
#include <QComboBox>
#include <QPushButton>
#include <QMainWindow>
#include <QObject>
#include <QSizePolicy>
#include <QSpacerItem>
#include <QTextBrowser>
#include <QCoreApplication>
#include <iostream>
#include <QDebug>
#include <QIODevice>
#include <QJsonDocument>
#include <QJsonObject>
#include <QFile>
#include <QProcess>
#include <QMessageBox>
#include <QObject>
using namespace std;
QComboBox *MainWindow::e1;
QComboBox *MainWindow::e2;
QComboBox *MainWindow::o1;
QMap<QString, QString> MainWindow::setting;
QMap<QString, QString> MainWindow::wine;
QString MainWindow::lastRunCommand = "";
MainWindow::MainWindow(){
/*********
* 设置变量
*********/
// 如果要添加其他 wine请使用安装更多 Wine 功能
QMainWindow *window = new QMainWindow();
QWidget *widget = new QWidget();
window->setCentralWidget(widget);
QGridLayout *mainLayout = new QGridLayout();
QSizePolicy size;
//size->setVerticalPolicy(0);
QWidget *leftUp = new QWidget();
mainLayout->addWidget(leftUp, 0, 0, 1, 1);
QGridLayout *leftUpLayout = new QGridLayout();
leftUp->setLayout(leftUpLayout);
QLabel *fastLabel = new QLabel(QObject::tr("快速启动"));
fastLabel->setStyleSheet("font: 30px;");
leftUpLayout->addWidget(fastLabel, 0, 0, 1, 2);
leftUpLayout->addWidget(new QLabel("<hr>"), 1, 0, 1, 2);
leftUpLayout->addWidget(new QLabel(QObject::tr("请选择容器路径:")), 2, 0, 1, 1);
e1 = new QComboBox();
e1->setEditable(1);
leftUpLayout->addWidget(e1, 3, 0, 1, 1);
button1 = new QPushButton("浏览");
//button1.clicked.connect(liulanbutton);
leftUpLayout->addWidget(button1, 3, 1, 1, 1);
leftUpLayout->addWidget(new QLabel(QObject::tr("请选择要执行的程序EXE、MSI或者命令")), 4, 0, 1, 1);
e2 = new QComboBox();
e2->setEditable(1);
leftUpLayout->addWidget(e2, 5, 0, 1, 1);
button2 = new QPushButton(QObject::tr("浏览"));
//button2.clicked.connect(liulanexebutton);
leftUpLayout->addWidget(button2, 5, 1, 1, 1);
leftUpLayout->addWidget(new QLabel(QObject::tr("请选择WINE版本")), 6, 0, 1, 1);
o1 = new QComboBox();
leftUpLayout->addWidget(o1, 7, 0, 1, 1);
// 设置空间权重
button1->setSizePolicy(size);
button2->setSizePolicy(size);
// UI 创建
QWidget *leftDown = new QWidget();
mainLayout->addWidget(leftDown, 1, 0, 1, 1);
QVBoxLayout *leftDownLayout = new QVBoxLayout();
leftDown->setLayout(leftDownLayout);
QLabel *highLabel = new QLabel(QObject::tr("高级功能"));
highLabel->setStyleSheet("font: 30px;");
leftDownLayout->addWidget(highLabel);
leftDownLayout->addWidget(new QLabel("<hr>"));
leftDownLayout->addWidget(new QLabel(QObject::tr("创建快捷方式Desktop文件")));
QHBoxLayout *createDesktopLink = new QHBoxLayout();
QLabel *label_r_2 = new QLabel(QObject::tr("名称:"));
createDesktopLink->addWidget(label_r_2);
QComboBox *combobox1 = new QComboBox();
combobox1->setEditable(1);
createDesktopLink->addWidget(combobox1);
QPushButton *button5 = new QPushButton(QObject::tr("创建到桌面"));
//button5.clicked.connect(make_desktop_on_desktop);
createDesktopLink->addWidget(button5);
QPushButton *saveDesktopFileOnLauncher = new QPushButton(QObject::tr("创建到开始菜单"));
//saveDesktopFileOnLauncher.clicked.connect(make_desktop_on_launcher);
createDesktopLink->addWidget(saveDesktopFileOnLauncher);
leftDownLayout->addLayout(createDesktopLink);
QGridLayout *programManager = new QGridLayout();
leftDownLayout->addLayout(programManager);
programManager->addWidget(new QLabel(QObject::tr("程序管理:")), 0, 0, 1, 1);
getProgramIcon = new QPushButton(QObject::tr("提取图标"));
//getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' '{e2.currentText()}" if e2.currentText()[:2].upper() == "C:" else f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}"));
programManager->addWidget(getProgramIcon, 1, 0, 1, 1);
programManager->addWidget(new QLabel(" "), 1, 1, 1, 1);
trasButton = new QPushButton(QObject::tr("窗口透明工具"));
//trasButton.clicked.connect(lambda: RunWineProgram(f"{programPath}/窗体透明度设置工具.exe"));
programManager->addWidget(trasButton, 1, 2, 1, 1);
uninstallProgram = new QPushButton(QObject::tr("卸载程序"));
//uninstallProgram.clicked.connect(lambda: RunWineProgram(f"{programPath}/geek.exe"));
programManager->addWidget(new QLabel(" "), 1, 3, 1, 1);
programManager->addWidget(uninstallProgram, 1, 4, 1, 1);
miniAppStore = new QPushButton(QObject::tr("微型应用商店"));
//miniAppStore.clicked.connect(lambda: threading.Thread(target=MiniAppStore).start());
programManager->addWidget(new QLabel(" "), 1, 5, 1, 1);
programManager->addWidget(miniAppStore, 1, 6, 1, 1);
programManager->addWidget(new QLabel(" "), 1, 7, 1, 1);
QPushButton *getProgramStatus = new QPushButton(QObject::tr("获取该程序运行情况"));
//getProgramStatus.clicked.connect(ProgramRunStatusShow.ShowWindow);
programManager->addWidget(getProgramStatus, 1, 8, 1, 1);
QPushButton *getLoseDll = new QPushButton(QObject::tr("检测静态下程序缺少DLL"));
//getLoseDll.clicked.connect(GetLoseDll);
programManager->addWidget(new QLabel(" "), 1, 9, 1, 1);
programManager->addWidget(getLoseDll, 1, 10, 1, 1);
programManager->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 1, 11, 1, 1);
programManager->addWidget(new QLabel(QObject::tr("WINE配置")), 2, 0, 1, 1);
wineConfig = new QPushButton(QObject::tr("配置容器"));
//wineConfig.clicked.connect(lambda: RunWineProgram("winecfg"));
programManager->addWidget(wineConfig, 3, 0, 1, 1);
QPushButton *fontAppStore = new QPushButton(QObject::tr("字体商店"));
//fontAppStore.clicked.connect(FontAppStore);
programManager->addWidget(fontAppStore, 3, 2, 1, 1);
button_r_6 = new QPushButton(QObject::tr("RegShot"));
//button_r_6.clicked.connect(lambda: RunWineProgram(f"{programPath}/RegShot/regshot.exe"));
programManager->addWidget(button_r_6, 3, 4, 1, 1);
QPushButton *sparkWineSetting = new QPushButton(QObject::tr("星火wine配置"));
//sparkWineSetting.clicked.connect(lambda: threading.Thread(target=os.system, args=["bash /opt/durapps/spark-dwine-helper/spark-dwine-helper-settings/settings.sh"]).start());
programManager->addWidget(sparkWineSetting, 3, 6, 1, 1);
QPushButton *wineAutoConfig = new QPushButton(QObject::tr("自动/手动配置 Wine 容器"));
//wineAutoConfig.clicked.connect(WineBottonAutoConfig);
programManager->addWidget(wineAutoConfig, 3, 8, 1, 1);
QPushButton *wineBottleReboot = new QPushButton(QObject::tr("重启指定Wine容器"));
//wineBottleReboot.clicked.connect(lambda: RunWineProgram(f"wineboot' '-k"));
programManager->addWidget(wineBottleReboot, 3, 10, 1, 1);
// 权重
button5->setSizePolicy(size);
saveDesktopFileOnLauncher->setSizePolicy(size);
label_r_2->setSizePolicy(size);
getProgramIcon->setSizePolicy(size);
//trasButton.setSizePolicy(size);
button_r_6->setSizePolicy(size);
wineConfig->setSizePolicy(size);
QTextBrowser *returnText = new QTextBrowser();
returnText->setStyleSheet("background-color: black;"\
"color: white;");
returnText->setText(QObject::tr("在此可以看到wine安装应用时的终端输出内容\n"\
"=============================================\n"\
"如果解决了你的问题请不要吝啬你的star哟\n"\
"地址:\n"\
"https://gitee.com/gfdgd-xi/deep-wine-runner\n"\
"https://github.com/gfdgd-xi/deep-wine-runner\n"\
"https://sourceforge.net/projects/deep-wine-runner"));
mainLayout->setRowStretch(0, 2);
mainLayout->setRowStretch(1, 1);
mainLayout->setColumnStretch(0, 2);
mainLayout->setColumnStretch(1, 1);
mainLayout->addWidget(returnText, 0, 1, 2, 1);
// 版权
QLabel *copy = new QLabel("程序版本:{version}<b>提示Wine 无法保证可以运行所有的 Windows 程序,如果想要运行更多 Windows 程序,可以考虑虚拟机和双系统</b><br/>"\
"<b>注:部分二进制兼容层会自动注册 binfmt如原版的 Box86/64、Qemu User Static则意味着无需在 Wine 版本那里特别指定兼容层,直接指定 Wine 即可</b><br/>"\
"©2020~" + QDateTime(QDateTime::currentDateTime()).toString("yyyy") + " gfdgd xi");
mainLayout->addWidget(copy, 2, 0, 1, 1);
// 程序运行
QWidget *programRun = new QWidget();
QHBoxLayout *programRunLayout = new QHBoxLayout();
programRun->setLayout(programRunLayout);
programRunLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
QPushButton *button3 = new QPushButton(QObject::tr("运行程序"));
//button3.clicked.connect(runexebutton);
programRunLayout->addWidget(button3);
QPushButton *killProgram = new QPushButton(QObject::tr("终止程序"));
//killProgram.clicked.connect(KillProgram);
programRunLayout->addWidget(killProgram);
QPushButton *killBottonProgram = new QPushButton(QObject::tr("终止指定容器的程序"));
//killBottonProgram.clicked.connect(lambda: threading.Thread(target=os.system, args=[f"'{programPath}/kill.sh' '{os.path.basename(e1.currentText())}'"]).start());
programRunLayout->addWidget(killBottonProgram);
mainLayout->addWidget(programRun, 2, 1, 1, 1);
// 窗口设置
window->resize(widget->frameGeometry().width() * 2, widget->frameGeometry().height());
window->setWindowIcon(QIcon(":/Icon/deepin-wine-runner.svg"));
widget->setLayout(mainLayout);
window->show();
CheckWine();
// 控件设置
e1->addItems(findExeHistory);
e2->addItems(wineBottonHistory);
combobox1->addItems(shellHistory);
o1->addItems(canUseWine);
// 一个 Wine 都没有却用 Wine 的功能
// 还是要处理的,至少不会闪退
if(o1->currentText() == ""){
o1->addItem("没有识别到任何Wine请在菜单栏“程序”安装Wine或安装任意Wine应用");
}
QObject::connect(button3, &QPushButton::clicked, [&](){
Runexebutton_threading *thread = new Runexebutton_threading();
//QObject::connect(thread, &Runexebutton_threading::signal, this, [this](){});
thread->start();
});
}
void MainWindow::Runexebutton_threading::run(){
QString programPath = QCoreApplication::applicationDirPath();
QString wineBottlePath = "";
if(e1->currentText() == ""){
wineBottlePath = setting.value("DefultBotton");
}
else{
wineBottlePath = e1->currentText();
}
QString option = "";
if(setting.value("Architecture") != "Auto"){
option += "WINEARCH=" + setting.value("Architecture") + " ";
}
if(setting.value("MonoGeckoInstaller") == "1"){
option += "WINEDLLOVERRIDES=\"mscoree,mshtml=\" ";
}
if(setting.value("") != "1"){
option += "WINEDEBUG=-all ";
}
else{
option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message ";
}
QString wineUsingOption = "";
QString exePath = e2->currentText();
QStringList fileName = {".exe"};
bool changePath = false;
for(QString i: fileName){
if(exePath.contains(i)){
qDebug() << i;
qDebug() << exePath;
int l = exePath.indexOf(i);
exePath = exePath.mid(0, l + 4) + "' " + exePath.mid(l + 4) + " '";
qDebug() << l;
qDebug() << exePath;
changePath = true;
break;
}
}
if(!changePath && QFile::exists(exePath)){
// 删除前后无用空格以防止出现问题
qDebug() << exePath;
exePath = exePath.trimmed();
// 有空格再说
if(exePath.contains(" ")){
int l = exePath.indexOf(" ");
exePath = exePath.mid(0, l) + "' " + exePath.mid(l) + " '";
qDebug() << l;
}
qDebug() << exePath;
}
if(o1->currentText() == "基于 UOS exagear 的 deepin-wine6-stable" ||
o1->currentText() == "基于 UOS box86 的 deepin-wine6-stable"){
wineUsingOption = "";
}
if(o1->currentText() == "基于 UOS box86 的 deepin-wine6-stable" ||
o1->currentText() == "基于 UOS exagear 的 deepin-wine6-stable"){
if(!QDir(programPath + "/dlls-arm").exists()){
if(system(("7z x -y \"" + programPath + "/dlls-arm.7z\" -o\"" + programPath + "\"").toUtf8())){
QMessageBox::critical(NULL, "错误", "无法解压资源");
return;
}
QFile::remove(programPath + "/dlls-arm.7z");
}
}
//QString runCommand = "";
QString runCommand = "";
QProcess *process = new QProcess();
//if(setting.value("TerminalOpen") == "True"){
if(0){
if(e2->currentText().mid(-4) == ".msi" && QFile::exists(e2->currentText())){
runCommand = "env WINEPREFIX='" + wineBottlePath + "' " + option + wine[o1->currentText()] + " msiexec /i '" + e2->currentText() + "' " + setting.value("WineOption");
// OpenTerminal(runCommand)
}
// ……
}
else{
if(e2->currentText().mid(-4) == ".msi" && QFile::exists(e2->currentText())){
runCommand = "env WINEPREFIX='" + wineBottlePath + "' " + option + wine[o1->currentText()] + " msiexec /i '" + e2->currentText() + "' " + setting.value("WineOption");
}
else if(e2->currentText().mid(-4) == ".bat" && QFile::exists(e2->currentText())){
runCommand = "WINEPREFIX='" + wineBottlePath + "' " + option + wine[o1->currentText()] + " wineconsole '" + e2->currentText() + "' " + setting["WineOption"];
}
else{
runCommand = "WINEPREFIX='" + wineBottlePath + "' " + option + wine[o1->currentText()] + " '" + exePath + "' " + setting["WineOption"];
}
}
// 实时读取程序返回
qDebug() << runCommand;
lastRunCommand = runCommand;
// 连接槽
connect(process, &QProcess::readyReadStandardOutput, this, [this, process](){
//emit this->signal(QString::fromUtf8(process.readAll()));
});
//if(setting.value("TerminalOpen") != "True"){
if(1){
process->setReadChannel(QProcess::StandardOutput);
process->start(runCommand);
process->waitForStarted();
process->waitForFinished();
process->close();
}
// ……
}
void MainWindow::DisableButton(bool things){
button_r_6->setDisabled(things);
button1->setDisabled(things);
button2->setDisabled(things);
button3->setDisabled(things);
wineConfig->setDisabled(things);
e1->setDisabled(things);
e2->setDisabled(things);
o1->setDisabled(things);
miniAppStore->setDisabled(things);
//winetricksOpen->configure(state=a[things])
getProgramIcon->setDisabled(things);
uninstallProgram->setDisabled(things);
trasButton->setDisabled(things);
}
void MainWindow::runexebutton(){
DisableButton(1);
}
MainWindow::~MainWindow()
{
//delete ui;
}
QString MainWindow::get_home(){
return QDir::homePath();
}
QString MainWindow::readtxt(QString path){
QFile file(path);
file.open(QIODevice::ReadOnly);
QString things = file.readAll();
file.close();
return things;
}
QByteArray MainWindow::readtxtByte(QString path){
QFile file(path);
file.open(QIODevice::ReadOnly);
QByteArray things = file.readAll();
file.close();
return things;
}
void MainWindow::write_txt(QString path, QByteArray things){
QFile file(path);
file.open(QIODevice::WriteOnly);
file.write(things);
file.close();
}
QString MainWindow::GetCommandResult(QString command){
QProcess process;
process.start(command);
process.waitForStarted();
process.waitForFinished();
QString result = process.readAll();
process.close();
return result;
}
/*
* 检测 Wine
*/
void MainWindow::CheckWine(){
QStringList wine7zUse = {"wine", "wine64", "wine-i386", "wine-aarch64", "wine-x86_64"};
wine.clear();
wine.insert("基于 UOS box86 的 deepin-wine6-stable",
"WINEPREDLL='" + programPath + "/dlls-arm' "\
"WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 "\
"/opt/deepin-box86/box86 /opt/deepin-wine6-stable/bin/wine ");
wine.insert("基于 UOS exagear 的 deepin-wine6-stable",
"WINEPREDLL='" + programPath + "/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib"\
" /opt/exagear/bin/ubt_x64a64_al --path-prefix " + get_home() + "/.deepinwine/debian-buster --utmp-paths-list " + get_home() + ""\
"/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list " + get_home() + "/.deepinwine/debian-buster/.exagear/vpaths-list"\
" --opaths-list " + get_home() + "/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart "\
"--fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ");
wine.insert("使用 Flatpak 安装的 Wine", "flatpak run org.winehq.Wine");
wine.insert("deepin-wine8-stable", "deepin-wine8-stable");
wine.insert("deepin-wine6 stable", "deepin-wine6-stable");
wine.insert("deepin-wine6-vannila", "deepin-wine6-vannila");
wine.insert("deepin-wine5 stable", "deepin-wine5-stable");
wine.insert("spark-wine", "spark-wine");
wine.insert("spark-wine7-devel", "spark-wine7-devel");
wine.insert("spark-wine8", "spark-wine8");
wine.insert("spark-wine8-wow", "spark-wine8-wow");
wine.insert("deepin-wine", "deepin-wine");
wine.insert("deepin-wine5", "deepin-wine5");
wine.insert("wine", "wine");
wine.insert("wine64", "wine64");
wine.insert("ukylin-wine", "ukylin-wine");
wine.insert("okylin-wine", "okylin-wine");
wine.insert("mono这不是 wine但可以实现初步调用运行 .net 应用)", "mono");
wine.insert("基于 linglong 的 deepin-wine6-stable不推荐", "ll-cli run '' --exec '/bin/deepin-wine6-stable'");
if(QFile::exists("/opt/deepin-box86/box86") && QFile::exists("/opt/deepin-wine6-stable/bin/wine")){
canUseWine.append("基于 UOS box86 的 deepin-wine6-stable");
}
if(QFile::exists("/opt/exagear/bin/ubt_x64a64_al") && QFile::exists("/opt/deepin-wine6-stable/bin/wine")){
canUseWine.append("基于 UOS exagear 的 deepin-wine6-stable");
}
for(QString i : wine.keys()){
if(!system(("which '" + wine.key(i) + "'").toUtf8())){
canUseWine.append(i);
}
}
if(!system("which flatpak") && QDir("/var/lib/flatpak/app/org.winehq.Wine").exists()){
canUseWine.append("使用 Flatpak 安装的 Wine");
}
if(QDir("/persistent/linglong/layers/").exists()){ // 判断是否使用 linglong
for(QString i : QDir("/persistent/linglong/layers/").entryList()){
try{
break; // bug
QString dire = QDir("/persistent/linglong/layers/" + i).entryList()[-1];
QString arch = QDir("/persistent/linglong/layers/" + i + "/" + dire)[-1];
if(QFile::exists("/persistent/linglong/layers/" + i + "/" + dire + "/" + arch + "/runtime/bin/deepin-wine6-stable")){
wine.insert("基于 linglong 的 deepin-wine6-stable不推荐", "ll-cli run " + i + " --exec '/bin/deepin-wine6-stable'");
canUseWine.append("基于 linglong 的 deepin-wine6-stable不推荐");
break;
}
}
catch(QString msg){
qDebug() << msg;
}
}
}
// 读取自定义安装的 Wine需要解包的才能使用
if(!system("which qemu-i386-static")){
if(QDir(qemuPath).exists()){
for(QString g: QDir(qemuPath).entryList()){
QString archPath = qemuPath + "/" + g;
QString arch = g;
if(QFileInfo(archPath).isDir()){
for(QString d: QDir(archPath).entryList()){
QString bottlePath = archPath + "/" + g;
if(QFileInfo(bottlePath).isDir()){
qemuBottleList.append(QStringList() << arch << d << bottlePath);
}
}
}
}
}
}
QJsonParseError jsonError;
QJsonDocument jsonDocument;
QJsonObject jsonObject;
QStringList historyList[] = {shellHistory, findExeHistory, wineBottonHistory, isoPath, isoPathFound};
QStringList historyListPath = {homePath + "/.config/deepin-wine-runner/ShellHistory.json",
homePath + "/.config/deepin-wine-runner/FindExeHistory.json",
homePath + "/.config/deepin-wine-runner/WineBottonHistory.json",
homePath + "/.config/deepin-wine-runner/ISOPath.json",
homePath + "/.config/deepin-wine-runner/ISOPathFound.json"};
for(int i = 0; i <= historyList->size(); i++){
QStringList *list = &historyList[i];
jsonDocument = QJsonDocument(QJsonDocument::fromJson(readtxtByte(historyListPath[i])));
jsonObject = jsonDocument.object();
list->clear();
for(QString i: jsonObject.keys()){
list->append(jsonObject.value(i).toString());
}
}
qDebug() << jsonError.errorString();
jsonDocument = QJsonDocument(QJsonDocument::fromJson(readtxtByte(homePath + "/.config/deepin-wine-runner/WineSetting.json")));
jsonObject = jsonDocument.object();
setting.clear();
for(QString i: jsonObject.keys()){
setting.insert(i, jsonObject.value(i).toString());
}
for(QString i: QDir(programPath + "/wine/").entryList()){
if(QDir(programPath + "/wine/" + i).exists() && QFileInfo(programPath + "/wine/" + i).isDir()){
QStringList nameValue = {{"", ""}};
try{
if(QFile::exists("/opt/deepin-box86/box86")){
nameValue.append(QStringList() << "基于 UOS box86 的 " <<
"WINEPREDLL='" + programPath + "/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1"\
" /opt/deepin-box86/box86 ");
}
if(!system("which box86")){
nameValue.append(QStringList() << "基于 box86 的 " << "box86 ");
}
if(!system("which box64")){
nameValue.append(QStringList() << "基于 box64 的 " << "box64 ");
}
if(!system("which qemu-i386") &&
GetCommandResult("arch").replace(" ", "").replace("\n", "") != "x86_64" &&
GetCommandResult("arch").replace(" ", "").replace("\n", "") != "i686"){
nameValue.append(QStringList() << "基于 qemu-i386 的 " << "qemu-i386 ");
}
if(!system("which qemu-x86_64") &&
GetCommandResult("arch").replace(" ", "").replace("\n", "") != "x86_64" &&
GetCommandResult("arch").replace(" ", "").replace("\n", "") != "i686"){
nameValue.append(QStringList() << "基于 qemu-x86_64 的 " << "qemu-x86_64 ");
}
if(QFile::exists("/opt/exagear/bin/ubt_x64a64_al") && QFile::exists(homePath + "/.deepinwine/debian-buster")){
nameValue.append(QStringList() << "基于 UOS exagear 的 " << "WINEPREDLL='" + programPath + "/dlls-arm' "\
"WINEDLLPATH=/opt/deepin-wine6-stable/lib /opt/exagear/bin/ubt_x64a64_al --path-prefix " + get_home() + "/.deepinwine/debian-buster "\
"--utmp-paths-list " + homePath + "/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list " + homePath + "/.deepinwine/debian-buster/.exagear/vpaths-list "\
"--opaths-list " + homePath + "/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- ");
}
if(!system("which exagear")){
nameValue.append(QStringList() << "运行 exagear 容器内的 " << "exagear -- ");
}
if(QFile::exists("/opt/exagear/bin/ubt_x64a64_al")){
nameValue.append(QStringList() << "使用 ubt_x64a64_al 运行" << "/opt/exagear/bin/ubt_x64a64_al -- ");
}
if(QFile::exists("/opt/exagear/bin/ubt_x32a64_al")){
nameValue.append(QStringList() << "使用 ubt_x32a64_al 运行" << "/opt/exagear/bin/ubt_x32a64_al -- ");
}
/*for(QString g: qemuBottleList){
nameValue.append(QStringList() << "使用qemu-" + g[0] + "-static 调用容器" + g[1] + "运行 " << "python3 '" + programPath + "/QemuRun.py' '" + g[0] + "/" + g[1] + "' " + setting.value("QemuUnMountHome").toInt());
}*/
}
catch(QString msg){
qDebug() << msg;
}
/*for(QString k: nameValue){
qDebug() << k;
if(k.contains("qemu")){
}
}*/
try{
for(QString i: QDir(homePath + "/.deepinwine/").entryList()){
for(QString j: wine7zUse){
if(QFile::exists(homePath + "/.deepinwine/" + i + "/bin/" + j)){
wine.insert(homePath + "/.deepinwine/" + i + "/bin/" + j, homePath + "/.deepinwine/" + i + "/bin/" + j);
canUseWine.append(homePath + "/.deepinwine/" + i + "/bin/" + j);
}
}
}
}
catch(QString msg){
qDebug() << msg;
}
try{
QStringList canUseWineOld = canUseWine;
for(QString i: canUseWineOld){
if(QDir(programPath + "/WineLib/usr").exists()){
wine.insert("使用运行器的运行库运行 " + i, "bash '" + programPath + "/WineLib/run.sh' " + wine.value(i));
canUseWine.append("使用运行器的运行库运行 " + i);
untipsWine.append("使用运行器的运行库运行 " + i);
}
}
if(QDir("/opt/exagear/images").exists()){
for(QString k: QDir("/opt/exagear/images").entryList()){
if(QFileInfo("/opt/exagear/images/" + k).isDir()){
continue;
}
for(QString i: canUseWineOld){
wine.insert("使用Exagear容器运行库运行 " + i, "bash '" + programPath + "/WineLib/run-more.sh' '/opt/exagear/images/" + k + "' " + wine.value(i));
canUseWine.append("使用Exagear容器运行库运行 " + i);
untipsWine.append("使用Exagear容器运行库运行 " + i);
}
}
}
}
catch(QString msg){
qDebug() << msg;
}
}
}
}