uengine-runner/Android X86/AXVM/mainwindow.cpp

150 lines
6.7 KiB
C++
Raw Permalink Normal View History

2022-08-03 22:59:13 +08:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QStringListModel>
#include <QStandardItem>
#include <QThread>
2022-08-11 12:27:25 +08:00
#include <QInputDialog>
#include <QFileDialog>
2022-08-03 22:59:13 +08:00
// 用于镜像信息获取
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
// 用于解析 JSON 数据
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
// 用于下载文件
#include <QProgressDialog>
#include "downloadthread.h"
#include <QLoggingCategory>
2022-08-11 12:27:25 +08:00
// 用于执行命令
#include <QProcess>
// 用于 Mini HTTP 服务器搭建
#include <getipserver.h>
2022-08-03 22:59:13 +08:00
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
2022-08-11 12:27:25 +08:00
QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, true);
2022-08-03 22:59:13 +08:00
// 获取网络镜像列表
QEventLoop loop;
QNetworkAccessManager manager;
2022-08-11 12:27:25 +08:00
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://120.25.153.144/AXVM/list.json")));
2022-08-03 22:59:13 +08:00
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
// 解析获取数据并显示
QString imageJsonList = reply->readAll();
QJsonDocument imageList = QJsonDocument::fromJson(imageJsonList.toUtf8());
name = imageList.array();
QStringList nameList;
QStandardItemModel *nameListModel = new QStandardItemModel(this);
int size = name.size();
2022-08-11 12:27:25 +08:00
qDebug() << size;
2022-08-03 22:59:13 +08:00
for (int i = 0; i < size; ++i) {
QJsonValue value = name.at(i);
QJsonArray obj = value.toArray();
QStandardItem *item = new QStandardItem(obj.at(0).toString());
nameListModel->appendRow(item);
}
ui->urlImageList->setModel(nameListModel);
// 允许 qDebug() 输出
QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, true);
2022-08-11 12:27:25 +08:00
GetIPServer *ip = new GetIPServer(ui->localIP);
2022-08-03 22:59:13 +08:00
}
MainWindow::~MainWindow()
{
delete ui;
}
// 安装事件
void MainWindow::on_pushButton_2_clicked()
{
2022-08-11 12:27:25 +08:00
if(ui->urlImageList->selectionModel()->currentIndex().row() == -1){ // 未选择任何选项
QMessageBox::information(this, "提示", "您未选择任何项");
return;
}
downloadDialog = new QProgressDialog("", "无用的按钮", 0, 100, this);
downloadDialog->setWindowTitle("正在下载“" + name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(0).toString() + "");
2022-08-03 22:59:13 +08:00
downloadDialog->show();
2022-08-11 12:27:25 +08:00
if(name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(3).isArray()){
if(QMessageBox::question(this, "提示", "推荐您手动下载格式包,是否手动获取链接并下载?") == QMessageBox::Yes){
QJsonArray urlList = name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(3).toArray();
QString urlThings = "";
for(int i = 0; i < urlList.size(); i=i+2){
urlThings += urlList.at(i).toString() + "" + urlList.at(i + 1).toString();
}
QString choose = QInputDialog::getMultiLineText(this,
"" + name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(0).toString() + "”下载链接",
"请在下面任选一个链接复制到浏览器地址栏进行下载下载完成后按下“OK”按钮选择下载的 OVA 文件如果想要取消操作请按“Cancal”",
urlThings);
if(choose == ""){ // 忽略取消
downloadDialog->close();
delete downloadDialog;
return;
}
QString path = QFileDialog::getOpenFileName(this, "浏览 OVA 文件", "~", "OVA文件(*.ova);;全部文件(*.*)");
if(path == ""){ // 忽略取消
downloadDialog->close();
delete downloadDialog;
return;
}
thread = new DownloadThread(downloadDialog,
path,
name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(0).toString(),
name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(2).toString(),
true);
//connect(thread, &DownloadThread::MessageBoxInfo, this, [this](QString info){QMessageBox::information(this, "提示", info);});
//connect(thread, &DownloadThread::MessageBoxError, this, [this](QString info){QMessageBox::critical(this, "错误", info);});
/*connect(thread, &DownloadThread::MessageBoxOpenVM, this, [this](QString vmName){
if(QMessageBox::question(this, "提示", "安装成功!是否现在马上启动虚拟机?") == QMessageBox::Yes){
QProcess process;
QStringList command;
command << "startvm" << vmName;
process.start("VBoxManage", command);
process.waitForFinished();
qDebug() << process.readAllStandardError();
qDebug() << process.readAllStandardOutput();
}});*/
thread->start();
return;
}
}
thread = new DownloadThread(downloadDialog,
name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(1).toString(),
name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(0).toString(),
name.at(ui->urlImageList->selectionModel()->currentIndex().row()).toArray().at(2).toString(),
false);
//connect(thread, &DownloadThread::MessageBoxInfo, this, &MainWindow::MessageBoxInfo);
//connect(thread, &DownloadThread::MessageBoxError, this, &MainWindow::MessageBoxError);
//connect(thread, &DownloadThread::MessageBoxOpenVM, this, &MainWindow::OpenVM);
2022-08-03 22:59:13 +08:00
thread->start();
}
2022-08-11 12:27:25 +08:00
void DownloadThread::MessageBoxInfo(QString info){
QMessageBox::information(NULL, "提示", info);
}
void DownloadThread::MessageBoxError(QString info){
QMessageBox::critical(NULL, "错误", info);
}
void DownloadThread::MessageBoxOpenVM(QString vmName)
{
if(QMessageBox::question(NULL, "提示", "安装成功!是否现在马上启动虚拟机?") == QMessageBox::Yes){
QProcess process;
QStringList command;
command << "startvm" << vmName;
process.start("VBoxManage", command);
process.waitForFinished();
qDebug() << process.readAllStandardError();
qDebug() << process.readAllStandardOutput();
}
}
void MainWindow::on_centralWidget_destroyed()
{
2022-08-03 22:59:13 +08:00
}