#include "MainWidget.h" #include "./ui_MainWidget.h" MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget) { ui->setupUi(this); setWindowTitle("打包Qt工具"); connect_operator(); control_init(); } MainWidget::~MainWidget() { delete ui; } void MainWidget::connect_operator() { connect(ui->btnSelcetBinary, &QPushButton::clicked, this, [=]() { SelectFile(this, ui->edBinary, "请选择Qt二进制文件", "所有文件 (*)"); }); connect(ui->btnSelectOut, &QPushButton::clicked, this, [=]() { SelectDirectory(this, ui->edOutDir); }); connect(ui->btnSelectQt, &QPushButton::clicked, this, [=]() { SelectDirectory(this, ui->edQtDir); }); connect(ui->btnAddEnv, &QPushButton::clicked, this, [=]() { add_env_btn(); }); connect(ui->btnDelEnv, &QPushButton::clicked, this, [=]() { del_env_btn(); }); connect(ui->btnGenerate, &QPushButton::clicked, this, [=]() { generate(); }); } void MainWidget::control_init() { ui->plainTextEdit->setEnabled(false); #if !defined (NDEBUG) ui->edBinary->setText("/home/typ/Downloads/build-QXmlEdit-Desktop_Qt_5_14_2_GCC_64bit-Release/build/qxmledit"); ui->edQtDir->setText("/home/typ/Qt5.14.2/5.14.2/gcc_64"); ui->edOutDir->setText("/home/typ/testpack"); #endif } void MainWidget::add_env_btn() { QString env = SelectDirectory(this, nullptr); if (env.isEmpty()) { return; } ui->listWidget->addItem(env); } void MainWidget::simple_log(const QString& info) { ui->plainTextEdit->appendPlainText(info + "\n"); } std::vector MainWidget::get_depend_on(const std::string& name, const std::vector& env) { std::vector vec; std::string cmd{}; if (!env.empty()) { cmd.append("export LD_LIBRARY_PATH=$LD_LIBRARY_PATH"); for (const auto& data : env) { cmd.append(":" + data); } } cmd.append(" && ldd " + name); char buffer[1024]{}; FILE* pf = nullptr; if ((pf = popen(cmd.c_str(), "r")) == nullptr) { return vec; } std::string result{}; while (std::fgets(buffer, sizeof(buffer), pf)) { result.append(buffer); } boost::split(vec, result, boost::is_any_of("\t")); return vec; } std::vector MainWidget::handle_result(const std::vector& vec) { std::vector ret; for (const auto& data : vec) { if (data.empty()) { continue; } std::string tdata = boost::replace_all_copy(data, "=>", ""); std::vector vt; boost::split(vt, tdata, boost::is_any_of(" ")); if (vt.size() != 4) { QString info = "长度不对,原始数据:\n" + QString::fromStdString(data); simple_log(info); continue; } if (boost::starts_with(vt[2], "/lib")) { continue; } ret.push_back(vt[2]); } return ret; } void MainWidget::del_env_btn() { QListWidgetItem* item = ui->listWidget->currentItem(); if (!item) { return; } delete ui->listWidget->takeItem(ui->listWidget->currentRow()); } QString MainWidget::SelectDirectory(QWidget* parent, QLineEdit* pEdit, const QString& pre_path) { QString start_path = pre_path; QDir folder(start_path); if (start_path.isEmpty() || !folder.exists()) { start_path = QDir::homePath(); } QString selectedDirectory = QFileDialog::getExistingDirectory(parent, u8"选择文件夹", start_path); if (selectedDirectory.isEmpty()) { return ""; } if (pEdit) { pEdit->setText(selectedDirectory); } return selectedDirectory; } QString MainWidget::SelectFile(QWidget* parent, QLineEdit* pEdit, const QString& info, const QString& filter) { QString filePath = QFileDialog::getOpenFileName(parent, info, QDir::homePath(), filter); if (!filePath.isEmpty() && !pEdit) { pEdit->setText(filePath); } return filePath; } bool MainWidget::isOk(QWidget* parent, const QString& title, const QString& content) { QMessageBox questionBox(parent); questionBox.setText(content); questionBox.setWindowTitle(title); questionBox.setIcon(QMessageBox::Question); questionBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); int result = questionBox.exec(); if (result != QMessageBox::Yes) { return false; } else { return true; } } void MainWidget::message(QWidget* parent, const QString& content) { QMessageBox::information(parent, "提示", content); } void MainWidget::generate() { ui->plainTextEdit->clear(); envs_.clear(); binary_ = ui->edBinary->text().trimmed(); fs::path binary_dir = fs::path(binary_.toStdString()).parent_path(); envs_.push_back(binary_dir.string()); int env_cnt = ui->listWidget->count(); for (int i = 0; i < env_cnt; ++i) { envs_.push_back(ui->listWidget->item(i)->text().toStdString()); } auto retPrevious = get_depend_on(binary_.toStdString(), envs_); auto result = handle_result(retPrevious); }