Qt项目开发遇到的问题3:添加dll模块,很多细节展示一下

1.添加模块问题是比较重要的,之前的主界面大体的框架是有了,主框架只是用来承载模块的一个程序,核心的内容都写在模块

里面,这样方便也快捷

这里直接放上头文件和.cpp:

#ifndef MODULESMANAGER_H
#define MODULESMANAGER_H

#include <QDialog>

namespace Ui {
class ModulesManager;
}

class ModulesManager : public QDialog
{
    Q_OBJECT

public:
    explicit ModulesManager(QWidget *parent = nullptr);
    ~ModulesManager();
signals:
    void sigReLoadModule(QString path);
public slots:
    void slotRefressTableWidget();
private:
    void AddModule();
    void DeleteModule();
    void InitTableWidget();
    void ReloadModule();

private:
    Ui::ModulesManager *ui;
    QStringList m_strMoudulePathName;
protected:
    virtual void closeEvent(QCloseEvent *e);

};

#endif // MODULESMANAGER_H
#include "modulesmanager.h"
#include "ui_modulesmanager.h"
#include <QSettings>
#include <QDebug>
#include <QFileDialog>
#include "mainwindow.h"

ModulesManager::ModulesManager(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ModulesManager)
{
    ui->setupUi(this);
    //添加
    connect(ui->pushButton,&QPushButton::released,this,&ModulesManager::AddModule);
    //删除
    connect(ui->pushButton_2,&QPushButton::released,this,&ModulesManager::DeleteModule);
    //重载
    connect(ui->pushButton_3,&QPushButton::released,this,&ModulesManager::ReloadModule);
    qDebug()<<"初始化";
    InitTableWidget();

}

ModulesManager::~ModulesManager()
{
    delete ui;
}

void ModulesManager::AddModule()
{
    //选择共享库并添加
    QStringList fileNames = QFileDialog::getOpenFileNames(this,"文件选择","",tr("动态库(*.dll *.so *.dylib);;"));
    qDebug() << fileNames;
    int oldCount = ui->tableWidget->rowCount();
    ui->tableWidget->setRowCount(oldCount+fileNames.size());
    for (int i = 0; i < fileNames.size(); i++) {
        QString str = fileNames[i];
        int istart = str.lastIndexOf("/");
        int iend = str.lastIndexOf(".");
        str = str.mid(istart+1,iend-istart-1);
        ui->tableWidget->setItem(oldCount+i,0,new QTableWidgetItem("未识别"));
        ui->tableWidget->setItem(oldCount+i,1,new QTableWidgetItem(str));
        ui->tableWidget->setItem(oldCount+i,2,new QTableWidgetItem(fileNames[i]));
    }

}

void ModulesManager::DeleteModule()
{
    //删除共享库
    if(ui->tableWidget->selectedItems().size() <= 0 ) return;
    int rownum = ui->tableWidget->selectedItems()[0]->row();
    ui->tableWidget->removeRow(rownum);
}

void ModulesManager::slotRefressTableWidget()
{
    InitTableWidget();
}

void ModulesManager::InitTableWidget()
{
    ui->tableWidget->clear();
    ui->tableWidget->setColumnCount(3);
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"名称"<<"模块"<<"路径");

    QString pathFile =  QCoreApplication::applicationDirPath() + "/Config.ini";
    QSettings *configIniRead = new QSettings(pathFile, QSettings::IniFormat);
    //将读取到的ini文件保存在QString中,先取值,然后通过toString()函数转换成QString类型
    configIniRead->setIniCodec("UTF8");
    QStringList listNames(QStringList()<<"name"<<"module"<<"path");
    int count = configIniRead->value("num/count").toInt();
    ui->tableWidget->setRowCount(count);
    for (int i = 0; i < count ; i++) {
        for (int j = 0; j < 3; j++) {

            QString str = QString("module%1/%2").arg(i+1).arg(listNames[j]);
            ui->tableWidget->setItem(i,j,new QTableWidgetItem(configIniRead->value(str).toString()));
        }
    }

    //读入入完成后删除指针
    delete configIniRead;

}

void ModulesManager::ReloadModule()
{
    if(ui->tableWidget->selectedItems().size() <= 0 ) return;
    int rownum = ui->tableWidget->selectedItems()[0]->row();
    QString path = ui->tableWidget->item(rownum,2)->text();
    qDebug() << path;
    emit sigReLoadModule(path);

}

void ModulesManager::closeEvent(QCloseEvent *e)
{
    QString pathFile =  QCoreApplication::applicationDirPath() + "/Config.ini";
    QSettings *configIniWrite = new QSettings(pathFile,QSettings::IniFormat);

    int count = ui->tableWidget->rowCount();
    configIniWrite->setIniCodec("UTF8");
    QStringList listNames(QStringList()<<"name"<<"module"<<"path");
    for (int i = 0; i < count; i++) {
        for(int j = 0; j < 3; j++){
        //向ini文件的第一个节写入内容,ip节下的第一个参数
        QString str = QString("module%1/%2").arg(i+1).arg(listNames[j]);
        QString str2 = ui->tableWidget->item(i,j)->text();
        configIniWrite->setValue(str,str2);
        }
    }
    configIniWrite->setValue("num/count",count);
    //写入完成后删除指针
    delete configIniWrite;
    QDialog::closeEvent(e);
}

 

 ui界面也很简单

 

这一篇就先到这里,功能的实现是这样的,之后的一篇来写在主框架中调用功能,并将功能显示在主框架中!

posted @ 2020-08-15 15:31  邱丑丑  阅读(284)  评论(0)    收藏  举报