+
+AboutProgram::AboutProgram(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::AboutProgram)
+{
+ ui->setupUi(this);
+ // 获取当前年份
+ QDate currentdate = QDate::currentDate();
+ int year = currentdate.year();
+ // 显示关于内容
+ ui->information->setHtml("Deepin Community Live CD 在线安装工具是一个能在 Live CD 上自动从互联网获取系统安装包安装系统的工具
"\
+ "目前支持安装 Debian
"\
+ "程序版本:" + QString(APP_VERSION) + "
"\
+ "QQ 交流群:881201853
"\
+ "本程序依照 GPLV3 协议开源
"\
+ "
"\
+ "程序地址:
"\
+ "\n"\
+ "Gitee:https://gitee.com/gfdgd-xi/deepin-community-live-cd-online-installer\n"\
+ "Github:https://github.com/gfdgd-xi/deepin-community-live-cd-online-installer\n"\
+ "
"\
+ "
"\
+ "©2022~" + QString::number(year) + " gfdgd xi
");
+}
+
+AboutProgram::~AboutProgram()
+{
+ delete ui;
+}
diff --git a/deepin-community-live-cd-online-installer/aboutprogram.h b/deepin-community-live-cd-online-installer/aboutprogram.h
new file mode 100644
index 0000000..bc5f5bf
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/aboutprogram.h
@@ -0,0 +1,22 @@
+#ifndef ABOUTPROGRAM_H
+#define ABOUTPROGRAM_H
+
+#include
+
+namespace Ui {
+class AboutProgram;
+}
+
+class AboutProgram : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit AboutProgram(QWidget *parent = nullptr);
+ ~AboutProgram();
+
+private:
+ Ui::AboutProgram *ui;
+};
+
+#endif // ABOUTPROGRAM_H
diff --git a/deepin-community-live-cd-online-installer/aboutprogram.ui b/deepin-community-live-cd-online-installer/aboutprogram.ui
new file mode 100644
index 0000000..fff7c42
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/aboutprogram.ui
@@ -0,0 +1,91 @@
+
+
+ AboutProgram
+
+
+
+ 0
+ 0
+ 732
+ 487
+
+
+
+ Dialog
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+ -
+
+
-
+
+
+ <img src=":/icon/icon.svg" width=256>
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+ buttonBox
+ accepted()
+ AboutProgram
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ AboutProgram
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+
diff --git a/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer.pro b/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer.pro
new file mode 100644
index 0000000..892f052
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer.pro
@@ -0,0 +1,54 @@
+QT += core gui network
+#QT += qtermwidget
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+CONFIG += c++17
+
+# 程序版本号
+VERSION = 1.0.0
+DEFINES += APP_VERSION=\\\"$$VERSION\\\"
+
+# You can make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+ aboutprogram.cpp \
+ diskcontrol.cpp \
+ editpartdialog.cpp \
+ installsystem.cpp \
+ installsystemwindow.cpp \
+ main.cpp \
+ mainwindow.cpp \
+ runcommandinterminal.cpp
+
+HEADERS += \
+ aboutprogram.h \
+ diskcontrol.h \
+ editpartdialog.h \
+ installsystem.h \
+ installsystemwindow.h \
+ mainwindow.h \
+ runcommandinterminal.h
+
+FORMS += \
+ aboutprogram.ui \
+ editpartdialog.ui \
+ installsystemwindow.ui \
+ mainwindow.ui
+
+TRANSLATIONS += \
+ deepin-community-live-cd-online-installer_zh_CN.ts
+CONFIG += lrelease
+CONFIG += embed_translations
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
+
+RESOURCES += \
+ icon.qrc
+
+unix:!macx: LIBS += -lqtermwidget5 # 这一行让我查了好久
diff --git a/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer_zh_CN.ts b/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer_zh_CN.ts
new file mode 100644
index 0000000..630fd35
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer_zh_CN.ts
@@ -0,0 +1,3 @@
+
+
+
diff --git a/deepin-community-live-cd-online-installer/diskcontrol.cpp b/deepin-community-live-cd-online-installer/diskcontrol.cpp
new file mode 100644
index 0000000..5b94d97
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/diskcontrol.cpp
@@ -0,0 +1,65 @@
+#include "diskcontrol.h"
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+DiskControl::DiskControl()
+{
+ // 检测是否以 root 权限运行
+ // 该库需要以 root 权限运行
+ if(!geteuid() == 0){
+ throw "Please run program with root!";
+ }
+}
+
+// 获取命令输出
+QString DiskControl::GetCommandReturn(QString command){
+ QProcess process;
+ process.start(command);
+ process.waitForFinished();
+ QString result = process.readAllStandardOutput();
+ process.close();
+ return result;
+}
+
+void DiskControl::GetDiskInfo(QStringList *diskPath, QStringList *diskFormat, QStringList *freeSpaceList, QStringList *totalSpaceList, QStringList *mountPathList){
+ // 清空列表
+ diskPath->clear();
+ diskFormat->clear();
+ freeSpaceList->clear();
+ totalSpaceList->clear();
+ mountPathList->clear();
+ QStringList diskList;
+ QString infoStr = GetCommandReturn("fdisk -l");
+ // 筛选字符串
+ QStringList oldList = infoStr.split("\n");
+ // 获取分区列表
+ for(int i = 0; i < oldList.size(); i++){
+ QString info = oldList.at(i);
+ // 判断是不是分区
+ if(info.trimmed().mid(0, 5) == "/dev/"){
+ // 二次筛选出路径
+ QStringList diskInfoList = info.split(" ");
+ QString disk = diskInfoList.at(0);
+ diskPath->append(disk);
+ // 筛选分区格式
+ //diskFormat->append(diskInfoList.at(diskInfoList.count() - 1));
+ }
+
+ }
+ // 获取分区格式和大小
+ for (int i = 0; i < diskPath->size(); i++){
+ QString disk = diskPath->at(i);
+ QStringList resultList = GetCommandReturn("df -H -T " + disk + "").split("\n").at(1).trimmed().split(" ");
+ resultList.removeAll("");
+ qDebug() << resultList;
+ diskFormat->append(resultList.at(1));
+ mountPathList->append(resultList.at(resultList.count() - 1));
+ freeSpaceList->append(resultList.at(resultList.count() - 3));
+ totalSpaceList->append(resultList.at(resultList.count() - 5));
+ }
+}
diff --git a/deepin-community-live-cd-online-installer/diskcontrol.h b/deepin-community-live-cd-online-installer/diskcontrol.h
new file mode 100644
index 0000000..ac0ed0e
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/diskcontrol.h
@@ -0,0 +1,17 @@
+#ifndef DISKCONTROL_H
+#define DISKCONTROL_H
+
+#include
+
+class DiskControl
+{
+private:
+ QString GetCommandReturn(QString command);
+
+public:
+ DiskControl();
+
+ void GetDiskInfo(QStringList *diskPath, QStringList *diskFormat, QStringList *freeSpaceList, QStringList *totalSpaceList, QStringList *mountPathList);
+};
+
+#endif // DISKCONTROL_H
diff --git a/deepin-community-live-cd-online-installer/editpartdialog.cpp b/deepin-community-live-cd-online-installer/editpartdialog.cpp
new file mode 100644
index 0000000..22e810d
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/editpartdialog.cpp
@@ -0,0 +1,56 @@
+#include "editpartdialog.h"
+#include "ui_editpartdialog.h"
+
+EditPartDialog::EditPartDialog(QString part, QMap *partSetMountPoint, QMap *partSetPartFormat, QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::EditPartDialog)
+{
+ ui->setupUi(this);
+ // 设置标题
+ this->setWindowTitle("编辑分区 " + part);
+ // 设置该 .h 下的全局变量
+ this->partSetMountPoint = partSetMountPoint;
+ this->partSetPartFormat = partSetPartFormat;
+ this->part = part;
+ // 判断之前有没有选择,有的话自动填写
+ if(partSetMountPoint->count(part)){
+ ui->mountPointChooser->setCurrentText(partSetMountPoint->value(part));
+ }
+ if(partSetPartFormat->count(part)){
+ ui->partFormatChooser->setCurrentText(partSetPartFormat->value(part));
+ }
+}
+
+EditPartDialog::~EditPartDialog()
+{
+ delete ui;
+}
+
+void EditPartDialog::on_buttonBox_accepted()
+{
+ // 判断选择的是不是有挂载点
+ if(ui->mountPointChooser->currentIndex() == 0){
+ // 如果不是
+ if(partSetMountPoint->count(part)){
+ // 移除标识
+ partSetMountPoint->remove(part);
+ }
+ }
+ else{
+ // 否则添加标识
+ partSetMountPoint->insert(part, ui->mountPointChooser->currentText());
+ }
+ // 判断选择的是不是格式化
+ if(ui->partFormatChooser->currentIndex() == 0){
+ // 如果不是
+ if(partSetPartFormat->count(part)){
+ partSetPartFormat->remove(part);
+ }
+ }
+ else{
+ // 否则添加标识
+ partSetPartFormat->insert(part, ui->partFormatChooser->currentText());
+ }
+
+}
+
diff --git a/deepin-community-live-cd-online-installer/editpartdialog.h b/deepin-community-live-cd-online-installer/editpartdialog.h
new file mode 100644
index 0000000..151392f
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/editpartdialog.h
@@ -0,0 +1,28 @@
+#ifndef EDITPARTDIALOG_H
+#define EDITPARTDIALOG_H
+
+#include
+
+namespace Ui {
+class EditPartDialog;
+}
+
+class EditPartDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit EditPartDialog(QString part, QMap *partSetMountPoint, QMap *partSetPartFormat, QWidget *parent = nullptr);
+ ~EditPartDialog();
+
+private slots:
+ void on_buttonBox_accepted();
+
+private:
+ Ui::EditPartDialog *ui;
+ QMap *partSetMountPoint;
+ QMap *partSetPartFormat;
+ QString part;
+};
+
+#endif // EDITPARTDIALOG_H
diff --git a/deepin-community-live-cd-online-installer/editpartdialog.ui b/deepin-community-live-cd-online-installer/editpartdialog.ui
new file mode 100644
index 0000000..f7e545e
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/editpartdialog.ui
@@ -0,0 +1,219 @@
+
+
+ EditPartDialog
+
+
+
+ 0
+ 0
+ 400
+ 300
+
+
+
+ 编辑分区
+
+
+
+ :/icon/icon.svg:/icon/icon.svg
+
+
+ -
+
+
-
+
+
-
+
+ 不设置挂载点
+
+
+ -
+
+ /
+
+
+ -
+
+ /boot
+
+
+ -
+
+ /boot/efi
+
+
+ -
+
+ /home
+
+
+ -
+
+ /opt
+
+
+ -
+
+ /usr
+
+
+
+
+ -
+
+
-
+
+ 不格式化
+
+
+ -
+
+ ext2
+
+
+ -
+
+ ext3
+
+
+ -
+
+ ext4
+
+
+ -
+
+ bfs
+
+
+ -
+
+ btrfs
+
+
+ -
+
+ cramfs
+
+
+ -
+
+ exfat
+
+
+ -
+
+ fat
+
+
+ -
+
+ minix
+
+
+ -
+
+ msdos
+
+
+ -
+
+ ntfs
+
+
+ -
+
+ reiserfs
+
+
+ -
+
+ vfat
+
+
+ -
+
+ xfs
+
+
+
+
+ -
+
+
+ 分区格式:
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ 挂载点:
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+
+
+
+ buttonBox
+ accepted()
+ EditPartDialog
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ EditPartDialog
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+
diff --git a/deepin-community-live-cd-online-installer/icon.png b/deepin-community-live-cd-online-installer/icon.png
new file mode 100644
index 0000000..56d76a7
Binary files /dev/null and b/deepin-community-live-cd-online-installer/icon.png differ
diff --git a/deepin-community-live-cd-online-installer/icon.qrc b/deepin-community-live-cd-online-installer/icon.qrc
new file mode 100644
index 0000000..4e1e0d6
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/icon.qrc
@@ -0,0 +1,10 @@
+
+
+ icon.png
+ icon.svg
+ no.png
+ no.svg
+ yes.png
+ yes.svg
+
+
diff --git a/deepin-community-live-cd-online-installer/icon.svg b/deepin-community-live-cd-online-installer/icon.svg
new file mode 100644
index 0000000..69c0466
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/icon.svg
@@ -0,0 +1,1033 @@
+
+
+
+
diff --git a/deepin-community-live-cd-online-installer/installsystem.cpp b/deepin-community-live-cd-online-installer/installsystem.cpp
new file mode 100644
index 0000000..857219f
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/installsystem.cpp
@@ -0,0 +1,16 @@
+#include "installsystem.h"
+#include "runcommandinterminal.h"
+#include
+#include
+#include
+
+InstallSystem::InstallSystem(QTermWidget *terminal, QProgressBar *progressbar, QMap partSetPartFormat, QMap partSetMountPoint)
+{
+ this->terminal = terminal;
+ this->progressbar = progressbar;
+ this->partSetMountPoint = partSetMountPoint;
+ this->partSetPartFormat = partSetPartFormat;
+ this->command = new RunCommandInTerminal(this->terminal, this->progressbar);
+ this->command->AddCommand("zenity --info");
+ this->command->RunCommand();
+}
diff --git a/deepin-community-live-cd-online-installer/installsystem.h b/deepin-community-live-cd-online-installer/installsystem.h
new file mode 100644
index 0000000..cc588d4
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/installsystem.h
@@ -0,0 +1,22 @@
+#ifndef INSTALLSYSTEM_H
+#define INSTALLSYSTEM_H
+
+#include "runcommandinterminal.h"
+#include
+#include
+#include
+#include
+
+class InstallSystem
+{
+public:
+ InstallSystem(QTermWidget *terminal, QProgressBar *progressbar, QMap partSetPartFormat, QMap partSetMountPoint);
+private:
+ QTermWidget *terminal;
+ QProgressBar *progressbar;
+ QMap partSetPartFormat;
+ QMap partSetMountPoint;
+ RunCommandInTerminal *command;
+};
+
+#endif // INSTALLSYSTEM_H
diff --git a/deepin-community-live-cd-online-installer/installsystemwindow.cpp b/deepin-community-live-cd-online-installer/installsystemwindow.cpp
new file mode 100644
index 0000000..c5e6c5e
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/installsystemwindow.cpp
@@ -0,0 +1,32 @@
+#include "installsystemwindow.h"
+#include "ui_installsystemwindow.h"
+#include "installsystem.h"
+#include
+#include
+#include
+#include
+//#include
+
+InstallSystemWindow::InstallSystemWindow(QMap partSetPartFormat, QMap partSetMountPoint, QWidget *parent) :
+ QMainWindow(parent),
+ ui(new Ui::InstallSystemWindow)
+{
+ ui->setupUi(this);
+ QTermWidget *ter = new QTermWidget(0);
+ ui->verticalLayout->addWidget(ter);
+ InstallSystem *system = new InstallSystem(ter, ui->progressBar, partSetPartFormat, partSetMountPoint);
+ /*ter->setColorScheme("DarkPastels");
+ ter->setShellProgram("/usr/bin/bash");
+ ter->setArgs(QStringList() << "-c" << "gedit");
+ ter->setAutoClose(0);
+ ter->setAutoFillBackground(1);
+ //ter->setTerminalBackgroundImage("/home/gfdgd_xi/Pictures/有兽档案馆Banner.png");
+ ter->startShellProgram();
+ connect(ter, &QTermWidget::finished, this, [&, this](){QMessageBox::information(NULL, "提示", "系统安装完成");});*/
+
+}
+
+InstallSystemWindow::~InstallSystemWindow()
+{
+ delete ui;
+}
diff --git a/deepin-community-live-cd-online-installer/installsystemwindow.h b/deepin-community-live-cd-online-installer/installsystemwindow.h
new file mode 100644
index 0000000..bb5d24a
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/installsystemwindow.h
@@ -0,0 +1,22 @@
+#ifndef INSTALLSYSTEMWINDOW_H
+#define INSTALLSYSTEMWINDOW_H
+
+#include
+
+namespace Ui {
+class InstallSystemWindow;
+}
+
+class InstallSystemWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit InstallSystemWindow(QMap partSetPartFormat, QMap partSetMountPoint, QWidget *parent = nullptr);
+ ~InstallSystemWindow();
+
+private:
+ Ui::InstallSystemWindow *ui;
+};
+
+#endif // INSTALLSYSTEMWINDOW_H
diff --git a/deepin-community-live-cd-online-installer/installsystemwindow.ui b/deepin-community-live-cd-online-installer/installsystemwindow.ui
new file mode 100644
index 0000000..66a5cf8
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/installsystemwindow.ui
@@ -0,0 +1,41 @@
+
+
+ InstallSystemWindow
+
+
+
+ 0
+ 0
+ 800
+ 600
+
+
+
+ MainWindow
+
+
+
+ -
+
+
+ 24
+
+
+
+
+
+
+
+
+
+
+
diff --git a/deepin-community-live-cd-online-installer/main.cpp b/deepin-community-live-cd-online-installer/main.cpp
new file mode 100644
index 0000000..6e7ab86
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/main.cpp
@@ -0,0 +1,32 @@
+#include "mainwindow.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ // 设置允许 qDebug 输出
+ QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, true);
+ QTranslator translator;
+ const QStringList uiLanguages = QLocale::system().uiLanguages();
+ for (const QString &locale : uiLanguages) {
+ const QString baseName = "deepin-community-live-cd-online-installer_" + QLocale(locale).name();
+ if (translator.load(":/i18n/" + baseName)) {
+ a.installTranslator(&translator);
+ break;
+ }
+ }
+ if(geteuid() != 0){
+ QMessageBox::critical(NULL, "错误", "请用 root 权限运行该程序");
+ return 1;
+ }
+ MainWindow w;
+ w.show();
+ return a.exec();
+}
diff --git a/deepin-community-live-cd-online-installer/mainwindow.cpp b/deepin-community-live-cd-online-installer/mainwindow.cpp
new file mode 100644
index 0000000..bfae939
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/mainwindow.cpp
@@ -0,0 +1,352 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "diskcontrol.h"
+#include "editpartdialog.h"
+#include "aboutprogram.h"
+#include "installsystemwindow.h"
+
+MainWindow::MainWindow(QWidget *parent)
+ : QMainWindow(parent)
+ , ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+ QString info = GetCommandReturn("dmesg");
+ bool uefiBoot = info.contains("EFI v");
+ // 设置程序标题
+
+ this->setWindowTitle("Deepin Community Live CD 安装工具 " + QString(APP_VERSION));
+ if(uefiBoot){
+ this->setWindowTitle(this->windowTitle() + "(UEFI启动)");
+ }
+ else{
+ this->setWindowTitle(this->windowTitle() + "(传统启动)");
+ }
+ SetDiskList(ui->diskChooser);
+ // 设置用户名和计算机名只能输入字母和数字
+ ui->userName->setValidator(new QRegExpValidator(QRegExp("[a-zA-Z0-9]+-+_+$")));
+ ui->hostName->setValidator(new QRegExpValidator(QRegExp("[a-zA-Z0-9]+-+_+$")));
+ // 读取当前用户名
+ ui->userName->setText(qgetenv("USER"));
+ // 读取当前计算机名
+ ui->hostName->setText(QHostInfo::localHostName());
+
+}
+
+MainWindow::~MainWindow()
+{
+ delete ui;
+}
+
+QStringList MainWindow::GetDiskList(){
+
+}
+
+void MainWindow::SetDiskList(QTableView *diskListWidget){
+ QStandardItemModel *nmodel = new QStandardItemModel(this);
+ // 设置表头
+ nmodel->setColumnCount(6);
+ nmodel->setHeaderData(0, Qt::Horizontal, "分区");
+ nmodel->setHeaderData(1, Qt::Horizontal, "分区格式");
+ nmodel->setHeaderData(2, Qt::Horizontal, "剩余空间");
+ nmodel->setHeaderData(3, Qt::Horizontal, "全部空间");
+ nmodel->setHeaderData(4, Qt::Horizontal, "设置挂载点");
+ nmodel->setHeaderData(5, Qt::Horizontal, "是否格式化");
+ //nmodel->setHeaderData(6, Qt::Horizontal, "");
+ // 设置不可编辑
+ diskListWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
+ // 设置选择整行且只能单选
+ diskListWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
+ diskListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+ // 显示信息
+ DiskControl diskControl;
+ QStringList diskPathList;
+ QStringList diskFormatList;
+ QStringList mountPathList;
+ QStringList freeSpaceList;
+ QStringList totalSpaceList;
+ diskControl.GetDiskInfo(&diskPathList, &diskFormatList, &freeSpaceList, &totalSpaceList, &mountPathList);
+ qDebug() << "=======Disk=========";
+ qDebug() << diskPathList;
+ qDebug() << diskFormatList;
+ qDebug() << mountPathList;
+ qDebug() << freeSpaceList;
+ qDebug() << totalSpaceList;
+ int count = diskPathList.size();
+ for(int i = 0; i < count; i++){
+ QString diskPath = diskPathList.at(i);
+ nmodel->setItem(i, 0, new QStandardItem(diskPath));
+ nmodel->setItem(i, 1, new QStandardItem(diskFormatList.at(i)));
+ nmodel->setItem(i, 2, new QStandardItem(freeSpaceList.at(i)));
+ nmodel->setItem(i, 3, new QStandardItem(totalSpaceList.at(i)));
+ if(partSetMountPoint.count(diskPath)){
+ nmodel->setItem(i, 4, new QStandardItem(partSetMountPoint.value(diskPath)));
+ }
+ if(partSetPartFormat.count(diskPath)){
+ nmodel->setItem(i, 5, new QStandardItem(partSetPartFormat.value(diskPath)));
+ }
+ }
+ diskListWidget->setModel(nmodel);
+}
+
+// 退出程序
+void MainWindow::on_action_exit_triggered()
+{
+ QApplication *app;
+ app->exit();
+}
+
+
+void MainWindow::on_refreshDiskList_clicked()
+{
+ SetDiskList(ui->diskChooser);
+}
+
+
+void MainWindow::on_editChoosePart_clicked()
+{
+ // 获取选择内容
+ int index = ui->diskChooser->currentIndex().row();
+ if(index == -1){
+ QMessageBox::information(this, "提示", "请先选择分区才能编辑");
+ return;
+ }
+ QAbstractItemModel *model = ui->diskChooser->model();
+ QString part = model->index(index, 0).data().toString();
+ // 创建对话框
+ EditPartDialog *dialog = new EditPartDialog(part, &partSetMountPoint, &partSetPartFormat, this);
+ // 堵塞线程
+ dialog->setAttribute(Qt::WA_ShowModal, true);
+ dialog->show();
+ if(dialog->exec()){
+ // 只有在按确定时才刷新列表
+ SetDiskList(ui->diskChooser);
+ QString showMsg = "当前状态:设置" + part;
+ if(partSetMountPoint.count(part)){
+ showMsg += "挂载点为" + partSetMountPoint.value(part);
+ }
+ if(partSetPartFormat.count(part)){
+ showMsg += "并格式化为" + partSetPartFormat.value(part) + "格式";
+ }
+ ui->statusbar->showMessage(showMsg);
+ }
+ delete dialog;
+}
+
+
+void MainWindow::on_userName_textChanged(const QString &arg1)
+{
+ // 自动清除空格
+ ui->userName->setText(ui->userName->text().replace(" ", ""));
+ // 用户名检测
+ if(ui->userName->text().size() < 2){
+ ui->userNameTips->setText("用户名:×用户名过短");
+ }
+ else if(ui->userName->text() == "root"){
+ ui->userNameTips->setText("用户名:×该用户名不合法");
+ }
+ else{
+ ui->userNameTips->setText("用户名:√");
+ }
+ // 检测是否有中文
+ QString userName = ui->userName->text();
+ for(int i = 0; i < userName.size(); i++){
+ QChar cha = userName.at(i);
+ ushort uni = cha.unicode();
+ if(uni >= 0x4E00 && uni <= 0x9FA5){
+ // 含有中文
+ ui->userNameTips->setText("用户名:×该用户名不合法(不能有中文)");
+ break;
+ }
+ if(specialSymbol.contains(userName.at(i))){
+ ui->userNameTips->setText("用户名:×不能含有特殊符号");
+ break;
+ }
+ }
+}
+
+
+void MainWindow::on_hostName_textChanged(const QString &arg1)
+{
+ // 自动清除空格
+ ui->hostName->setText(ui->hostName->text().replace(" ", ""));
+ // 计算机名检测
+ if(ui->hostName->text().size() < 2){
+ ui->hostNameTips->setText("主机名:×主机名过短");
+ }
+ else{
+ ui->hostNameTips->setText("主机名:√");
+ }
+ // 检测是否有中文
+ QString userName = ui->hostName->text();
+ for(int i = 0; i < userName.size(); i++){
+ QChar cha = userName.at(i);
+ ushort uni = cha.unicode();
+ if(uni >= 0x4E00 && uni <= 0x9FA5){
+ // 含有中文
+ ui->hostNameTips->setText("用户名:×该用户名不合法(不能有中文)");
+ break;
+ }
+ if(specialSymbol.contains(userName.at(i))){
+ ui->userNameTips->setText("用户名:×不能含有特殊符号");
+ break;
+ }
+ }
+}
+
+
+void MainWindow::on_rootPassword0_textChanged(const QString &arg1)
+{
+ // 检查密码
+ PasswordCheck(ui->rootPasswordTips0, ui->rootPasswordTips1, ui->rootPassword0, ui->rootPassword1, "root 用户密码:", "再输一次root用户密码:");
+}
+
+
+void MainWindow::on_rootPassword1_textChanged(const QString &arg1)
+{
+ // 检查密码
+ PasswordCheck(ui->rootPasswordTips0, ui->rootPasswordTips1, ui->rootPassword0, ui->rootPassword1, "root 用户密码:", "再输一次root用户密码:");
+}
+
+
+void MainWindow::on_action_about_triggered()
+{
+ // 显示关于窗口
+ AboutProgram program;
+ // 堵塞线程
+ program.setAttribute(Qt::WA_ShowModal, true);
+ program.show();
+ program.exec();
+}
+
+// 密码检查
+// (方便复用)
+void MainWindow::PasswordCheck(QLabel *label0, QLabel *label1, QLineEdit *password0, QLineEdit *password1, QString labelTips0, QString labelTips1){
+ // 如果密码不相同就显示提示
+ if(password0->text() == password1->text()){
+ label0->setText(labelTips0 + "√");
+ label1->setText(labelTips1 + "√");
+ }
+ else{
+ label1->setText(labelTips1 + "×两次密码不相同!");
+ }
+ // 空密码提示
+ if(password0->text() == ""){
+ label0->setText(labelTips0 + "×密码不能为空");
+ }
+ else{
+ label0->setText(labelTips0 + "√");
+ }
+ if(password1->text() == ""){
+ label1->setText(labelTips1 + "×密码不能为空");
+ }
+}
+
+void MainWindow::on_userPassword0_textChanged(const QString &arg1)
+{
+ // 检查密码
+ PasswordCheck(ui->userPasswordTips0, ui->userPasswordTips1, ui->userPassword0, ui->userPassword1, "用户密码:", "再输一次用户密码:");
+}
+
+
+void MainWindow::on_userPassword1_textChanged(const QString &arg1)
+{
+ // 检查密码
+ PasswordCheck(ui->userPasswordTips0, ui->userPasswordTips1, ui->userPassword0, ui->userPassword1, "用户密码:", "再输一次用户密码:");
+}
+
+// 获取命令输出
+QString MainWindow::GetCommandReturn(QString command){
+ QProcess process;
+ process.start(command);
+ process.waitForFinished();
+ QString result = process.readAllStandardOutput();
+ process.close();
+ return result;
+}
+
+void MainWindow::on_installButton_clicked()
+{
+ // 这里先忽略合法性检测,直接显示窗口以调试
+ InstallSystemWindow *window = new InstallSystemWindow(this->partSetPartFormat, this->partSetMountPoint);
+ window->show();
+ return;
+ // 检测合法性
+ // 检测是否有相同挂载点
+ QList keyList = partSetMountPoint.keys();
+ QMap alreadySetMountPoint;
+ for(int i = 0; i < keyList.size(); i++){
+ if(alreadySetMountPoint.count(partSetMountPoint.value(keyList.at(i)))){
+ QMessageBox::critical(this, "错误", "不能设置多个挂载点“" + partSetMountPoint.value(keyList.at(i)) + "”");
+ return;
+ }
+ alreadySetMountPoint.insert(partSetMountPoint.value(keyList.at(i)), true);
+ }
+ // 检测是否有设置挂载点 /
+ if(!alreadySetMountPoint.count("/")){
+ QMessageBox::critical(this, "错误", "没有设置挂载点“/”");
+ return;
+ }
+ // 判断是否为 UEFI 启动
+ QString info = GetCommandReturn("dmesg");
+ if(info.contains("EFI v") && !alreadySetMountPoint.count("/boot/efi")){
+ QMessageBox::critical(this, "错误", "请设置挂载点“/boot/efi”");
+ return;
+ }
+ // 检测密码
+ if(ui->rootPassword0->text() != ui->rootPassword1->text()){
+ QMessageBox::critical(this, "错误", "root 密码不相同");
+ return;
+ }
+ if(ui->userPassword0->text() != ui->userPassword1->text()){
+ QMessageBox::critical(this, "错误", "用户密码不相同");
+ return;
+ }
+ // 检测用户名和计算机名是否合法
+ if(ui->hostName->text().size() < 2){
+ QMessageBox::critical(this, "错误", "主机名不合法");
+ return;
+ }
+ if(ui->userName->text().size() < 2){
+ QMessageBox::critical(this, "错误", "用户名不合法");
+ return;
+ }
+ // 检测是否有中文
+ QString userName = ui->userName->text();
+ for(int i = 0; i < userName.size(); i++){
+ QChar cha = userName.at(i);
+ ushort uni = cha.unicode();
+ if(uni >= 0x4E00 && uni <= 0x9FA5){
+ // 含有中文
+ QMessageBox::critical(this, "错误", "用户名不合法");
+ return;
+ }
+ if(specialSymbol.contains(userName.at(i))){
+ QMessageBox::critical(this, "错误", "用户名不合法");
+ return;
+ }
+ }
+ userName = ui->hostName->text();
+ for(int i = 0; i < userName.size(); i++){
+ QChar cha = userName.at(i);
+ ushort uni = cha.unicode();
+ if(uni >= 0x4E00 && uni <= 0x9FA5){
+ // 含有中文
+ QMessageBox::critical(this, "错误", "主机名不合法");
+ break;
+ }
+ if(specialSymbol.contains(userName.at(i))){
+ QMessageBox::critical(this, "错误", "主机名不合法");
+ break;
+ }
+ }
+
+ //window->exec();
+}
+
diff --git a/deepin-community-live-cd-online-installer/mainwindow.h b/deepin-community-live-cd-online-installer/mainwindow.h
new file mode 100644
index 0000000..50ce066
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/mainwindow.h
@@ -0,0 +1,54 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include
+#include
+#include
+#include
+
+QT_BEGIN_NAMESPACE
+namespace Ui { class MainWindow; }
+QT_END_NAMESPACE
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ MainWindow(QWidget *parent = nullptr);
+ ~MainWindow();
+
+private slots:
+ void on_action_exit_triggered();
+
+ void on_refreshDiskList_clicked();
+
+ void on_editChoosePart_clicked();
+
+ void on_userName_textChanged(const QString &arg1);
+
+ void on_hostName_textChanged(const QString &arg1);
+
+ void on_rootPassword0_textChanged(const QString &arg1);
+
+ void on_rootPassword1_textChanged(const QString &arg1);
+
+ void on_action_about_triggered();
+
+ void on_userPassword0_textChanged(const QString &arg1);
+
+ void on_userPassword1_textChanged(const QString &arg1);
+
+ void on_installButton_clicked();
+
+private:
+ QString GetCommandReturn(QString command);
+ Ui::MainWindow *ui;
+ void SetDiskList(QTableView *diskListWidget);
+ QStringList GetDiskList();
+ QMap partSetMountPoint;
+ QMap partSetPartFormat;
+ void PasswordCheck(QLabel *label0, QLabel *label1, QLineEdit *password0, QLineEdit *password1, QString labelTips0, QString labelTips1);
+ QStringList specialSymbol = {"`", "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "=", "|", "\\", "[", "]", "{", "}", ":", ";", "\"", "'", ",", "<", ">", "?", "/"};
+};
+#endif // MAINWINDOW_H
diff --git a/deepin-community-live-cd-online-installer/mainwindow.ui b/deepin-community-live-cd-online-installer/mainwindow.ui
new file mode 100644
index 0000000..965ab3a
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/mainwindow.ui
@@ -0,0 +1,311 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 1007
+ 638
+
+
+
+ MainWindow
+
+
+
+ :/icon/icon.svg:/icon/icon.svg
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ 安装系统
+
+
+
+ -
+
+
-
+
+ bookworm
+
+
+ -
+
+ sid
+
+
+ -
+
+ bullseye
+
+
+ -
+
+ buster
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 刷新磁盘列表
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 安装系统:
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+ -
+
+
-
+
+
+ <html><head/><body><p>如果需要添加/删除分区等操作,请使用其他分区工具操作,如 gparted</p></body></html>
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 编辑选中分区
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
-
+
+
+ root 用户密码:<a style='color: red;'><b>×</b></a>没有填写
+
+
+
+ -
+
+
+ QLineEdit::Password
+
+
+
+ -
+
+
+ 再输一次root用户密码:<a style='color: red;'><b>×</b></a>没有填写
+
+
+
+ -
+
+
+ QLineEdit::Password
+
+
+
+ -
+
+
+ <hr>
+
+
+
+ -
+
+
+ 用户名:<a style='color: red;'><b>×</b></a>没有填写
+
+
+
+ -
+
+
+ QLineEdit::Normal
+
+
+
+ -
+
+
+ 用户密码:<a style='color: red;'><b>×</b></a>没有填写
+
+
+
+ -
+
+
+ QLineEdit::Password
+
+
+
+ -
+
+
+ 再输一次用户密码:<a style='color: red;'><b>×</b></a>没有填写
+
+
+
+ -
+
+
+ QLineEdit::Password
+
+
+
+ -
+
+
+ <hr>
+
+
+
+ -
+
+
+ 主机名:<a style='color: red;'><b>×</b></a>没有填写
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 退出(&E)
+
+
+
+
+ 关于(&A)
+
+
+
+
+ false
+
+
+ QQ 交流群:881201853
+
+
+
+
+
+
+
+
diff --git a/deepin-community-live-cd-online-installer/no.png b/deepin-community-live-cd-online-installer/no.png
new file mode 100644
index 0000000..adc36eb
Binary files /dev/null and b/deepin-community-live-cd-online-installer/no.png differ
diff --git a/deepin-community-live-cd-online-installer/no.svg b/deepin-community-live-cd-online-installer/no.svg
new file mode 100644
index 0000000..b7e43d0
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/no.svg
@@ -0,0 +1,54 @@
+
+
+
+
diff --git a/deepin-community-live-cd-online-installer/runcommandinterminal.cpp b/deepin-community-live-cd-online-installer/runcommandinterminal.cpp
new file mode 100644
index 0000000..42fb784
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/runcommandinterminal.cpp
@@ -0,0 +1,38 @@
+#include "runcommandinterminal.h"
+#include
+#include
+
+RunCommandInTerminal::RunCommandInTerminal(QTermWidget *terminal, QProgressBar *progressbar)
+{
+ this->terminal = terminal;
+ this->progressbar = progressbar;
+}
+
+void RunCommandInTerminal::AddCommand(QString command){
+ commandList.append(command);
+}
+
+void RunCommandInTerminal::RunCommand(){
+ this->runStatus = true;
+ // 写入为 Bash 文件,方便执行
+ QString commandCode = "#!/bin/bash\n";
+ QString bashPath = "/tmp/deepin-community-live-cd-installer-" + QString::number(QDateTime::currentMSecsSinceEpoch()) + ".sh";
+ for(int i = 0; i < this->commandList.size(); i++){
+ commandCode += this->commandList.at(i) + "\n";
+ }
+ commandCode += "rm -rfv '" + bashPath + "'";
+ QFile file(bashPath);
+ file.open(QFile::WriteOnly);
+ if(!file.isWritable()){
+ throw "Can't write the file!";
+ }
+ file.write(commandCode.toUtf8());
+ file.close();
+ system(("chmod +x '" + bashPath + "'").toUtf8()); // 赋予运行权限
+ this->terminal->setColorScheme("DarkPastels");
+ this->terminal->setShellProgram("/usr/bin/bash");
+ this->terminal->setArgs(QStringList() << bashPath);
+ this->terminal->setAutoClose(1);
+ this->terminal->setAutoFillBackground(1);
+ this->terminal->startShellProgram();
+}
diff --git a/deepin-community-live-cd-online-installer/runcommandinterminal.h b/deepin-community-live-cd-online-installer/runcommandinterminal.h
new file mode 100644
index 0000000..7b37d3d
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/runcommandinterminal.h
@@ -0,0 +1,20 @@
+#ifndef RUNCOMMANDINTERMINAL_H
+#define RUNCOMMANDINTERMINAL_H
+
+#include
+#include
+
+class RunCommandInTerminal
+{
+public:
+ RunCommandInTerminal(QTermWidget *terminal, QProgressBar *progressbar);
+ void AddCommand(QString command);
+ void RunCommand();
+ QStringList commandList;
+private:
+ QTermWidget *terminal;
+ QProgressBar *progressbar;
+ bool runStatus;
+};
+
+#endif // RUNCOMMANDINTERMINAL_H
diff --git a/deepin-community-live-cd-online-installer/yes.png b/deepin-community-live-cd-online-installer/yes.png
new file mode 100644
index 0000000..f7a62fc
Binary files /dev/null and b/deepin-community-live-cd-online-installer/yes.png differ
diff --git a/deepin-community-live-cd-online-installer/yes.svg b/deepin-community-live-cd-online-installer/yes.svg
new file mode 100644
index 0000000..967f6e9
--- /dev/null
+++ b/deepin-community-live-cd-online-installer/yes.svg
@@ -0,0 +1,54 @@
+
+
+
+