#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; } } } }