164 lines
5.0 KiB
C++
164 lines
5.0 KiB
C++
#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<std::string> MainWidget::get_depend_on(const std::string& name, const std::vector<std::string>& env)
|
|
{
|
|
std::vector<std::string> 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<std::string> MainWidget::handle_result(const std::vector<std::string>& vec)
|
|
{
|
|
std::vector<std::string> ret;
|
|
for (const auto& data : vec) {
|
|
if (data.empty()) {
|
|
continue;
|
|
}
|
|
std::string tdata = boost::replace_all_copy(data, "=>", "");
|
|
std::vector<std::string> 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);
|
|
} |