Qt程序设计——实现以项目管理文件的功能:创建和打开项目

来源:互联网 发布:移动网络转换电信 编辑:程序博客网 时间:2024/06/10 06:49

1.引言

软件中很多是以项目的形式进行管理的,比如时常使用的Visual Studio等。下面使用Qt实现该功能。主要由新建项目和打开已存在项目

新建项目时建立一个.pro文件,pro文件内的内容如下所示:


之所以这样,是为了方便读取项目中的一些文件。

2.新建项目

新建项目时弹出一个对话框,输入项目名和项目要保存的路径,此外,还需输入一个文件夹的目录,因为要将此文件夹拷贝到项目目录路径下。

新建项目的对话框如下:


程序如下:

主要就是获取输入的项目名称以及目录

//newproject.h#ifndef NEWPROJECT_H#define NEWPROJECT_H#include <QDialog>#include <QString>namespace Ui {class NewProject;}class NewProject : public QDialog{    Q_OBJECT    public:    explicit NewProject(QWidget *parent = 0);    ~NewProject();    //获得新建项目名    QString get_new_project_name(){return new_project_name_;}    //获得新建项目的目录    QString get_new_project_dir(){return new_project_dir_;}    //获得可执行文件所在文件夹路径    QString get_excute_file_dir(){return excute_file_dir_;}    private:    Ui::NewProject *ui;    QString new_project_name_;//新建项目名    QString new_project_dir_;//新建项目文件夹路径    QString excute_file_dir_;//可执行文件所在文件夹路径private slots:    void choose_project_dir();//选择项目目录按钮    void choose_excute_dir();//选择可执行文件所在文件夹目录    void ok_new_project();//确定按钮    void cancel_new_project_();//取消按钮};#endif // NEWPROJECT_H//newproject.cpp#include "newproject.h"#include "ui_newproject.h"#include <QFileDialog>#include <QMessageBox>//构造函数NewProject::NewProject(QWidget *parent) :    QDialog(parent),    ui(new Ui::NewProject){    ui->setupUi(this);    //选择新建项目目录按钮信号槽    connect(ui->chooseProjectDir,SIGNAL(clicked()),this,SLOT(choose_project_dir()));    //选择可执行文件所在文件夹目录按钮信号槽    connect(ui->chooseExcuteDir,SIGNAL(clicked()),this,SLOT(choose_excute_dir()));    //确定按钮信号槽    connect(ui->okNewProject,SIGNAL(clicked()),this,SLOT(ok_new_project()));    //取消按钮信号槽    connect(ui->cancelNewProject,SIGNAL(clicked()),this,SLOT(cancel_new_project_()));    //连接接受槽    connect(ui->okNewProject,SIGNAL(clicked()),this,SLOT(accept()));    //连接拒绝槽    connect(ui->cancelNewProject,SIGNAL(clicked()),this,SLOT(reject()));}//析构函数NewProject::~NewProject(){    delete ui;}/************************************************************/  /*功能:选择新建项目目录    设计:弹出选择文件夹的对话框,选择文件夹*//************************************************************/void NewProject::choose_project_dir(){    QFileDialog *file_dialog=new QFileDialog(this);    file_dialog->setOption(QFileDialog::ShowDirsOnly);//设置显示选项    file_dialog->setFileMode(QFileDialog::Directory);//设置文件模式    file_dialog->setViewMode(QFileDialog::List);//设置显示模式    //点击确定按钮    if(file_dialog->exec()==QFileDialog::Accepted)    {        //获取新建项目路径        new_project_dir_=file_dialog->selectedFiles().at(0);        ui->projectDir->setText(new_project_dir_);//设置路径栏    }    //点取消则返回    else    {        return;    }    delete file_dialog;    file_dialog=NULL;}/************************************************************/  /*功能:选择可执行文件所在文件夹路径    设计:弹出选择文件夹的对话框,选择文件夹*//************************************************************/void NewProject::choose_excute_dir(){    QFileDialog *file_dialog=new QFileDialog(this);    //file_dialog->setOption(QFileDialog::ShowDirsOnly);//设置显示选项    file_dialog->setFileMode(QFileDialog::Directory);//设置文件模式    file_dialog->setViewMode(QFileDialog::List);//设置显示模式    //点击确定按钮    if(file_dialog->exec()==QFileDialog::Accepted)    {        //获取exe文件所在文件夹路径        excute_file_dir_=file_dialog->selectedFiles().at(0);        ui->excuteDir->setText(excute_file_dir_);//设置exe文件夹路径栏    }    //点取消则返回    else    {        return;    }    delete file_dialog;    file_dialog=NULL;}//确定新建项目void NewProject::ok_new_project(){    //获取项目名    new_project_name_=ui->projectName->text().trimmed();    //判断名字是否为空    if( new_project_name_.isEmpty() || new_project_dir_.isEmpty() )    {        QMessageBox::information(this,"提示","表格未填完整,新建项目失败",QMessageBox::Yes);    }}//取消新建项目void NewProject::cancel_new_project_(){    QMessageBox::information(this,"提示","已取消新建项目",QMessageBox::Yes);}


在主界面的实现程序中,调用此新建项目对话框,获取项目名称以及路径

主界面如下:


在MainWindow类中完成新建项目和打开项目的功能,需要注意的一点,主界面中的三个控件可以伸缩。

//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QFile>#include <QSplitter>#include <QDir>#include "twodimcurve.h"#include "nehewidget.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECT    public:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();    private slots:    void new_project();//新建项目菜单    void open_project();//打开项目菜单private:    Ui::MainWindow *ui;    QSplitter *hsplitter;//水平分割器    QSplitter *vsplitter;//垂直分割器    //文件名    QVector<QString> project_name_;//项目名称    QVector<QString> pro_path_;//项目文件路径(pro文件)    QVector<QString> project_dir_;//项目目录    QVector<QString> excute_dir_;//可执行文件目录(在项目中的目录)};#endif // MAINWINDOW_H//mainwindow.cpp#include "mainwindow.h"#include "ui_mainwindow.h"#include <QFile>#include <QTimer>#include <QGridLayout>#include <QFileDialog>#include <QProcess>#include <QTextStream>#include "newproject.h"#include "parameterset.h"#include "file_readwrite.h"MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    //设置水平和垂直分割器,界面布局    hsplitter=new QSplitter;//水平    vsplitter=new QSplitter;//垂直    vsplitter->setOrientation(Qt::Vertical);    setCentralWidget(hsplitter);    //注意部件顺序    hsplitter->addWidget(ui->treeWidget);    hsplitter->addWidget(vsplitter);    vsplitter->addWidget(ui->mdiArea);    vsplitter->addWidget(ui->tabWidget);    //新建项目信号槽    connect(ui->newProject,SIGNAL(triggered()),this,SLOT(new_project()));    //打开项目信号槽    connect(ui->openProject,SIGNAL(triggered()),this,SLOT(open_project()));}//构造函数MainWindow::~MainWindow(){    delete ui;}/************************************************************/  /*功能:新建项目    *//************************************************************/void MainWindow::new_project(){    NewProject project;    //所有栏都填完,且按下确定按钮    if(project.exec()==QDialog::Accepted)    {        //获取新建项目名        QString project_name__=project.get_new_project_name();        //获取项目路径名        QString project_dir__=project.get_new_project_dir();        //获取可执行文件所在文件夹路径名        QString excute_dir__=project.get_excute_file_dir();        //新建项目失败        if(project_name__.isEmpty() || project_dir__.isEmpty())            return;        //新建项目成功        else        {            project_name_.append(project_name__);//添加项目名称            //新建项目文件夹            QDir dir(project_dir__);//项目文件夹所在目录            dir.mkdir(project_name__);//创建以项目名为名字的目录            QString _project_dir_=dir.absoluteFilePath(project_name__);//获取项目文件夹的绝对路径            project_dir_.append(_project_dir_);//添加项目文件夹路径            QDir project_dir(_project_dir_);            //新建可执行文件文件夹            QString _excute_dir_;//可执行文件在项目目录中的目录            if(!excute_dir__.isEmpty())            {                project_dir.mkdir("ExcuteFile");                _excute_dir_=project_dir.absoluteFilePath("ExcuteFile");//获取绝对路径                excute_dir_.append(_excute_dir_);//添加可执行文件的文件夹路径                //复制可执行文件内容                QDir excute_dir_from_(excute_dir__);//可执行文件文件夹原目录                QDir excute_dir_to_(_excute_dir_);//可执行文件文件夹在项目中的目录                if(!qCopyDirectory(excute_dir_from_,excute_dir_to_,true))                {                    QMessageBox::information(this,"提示","可执行文件复制失败!");                }            }            else            {                QMessageBox::information(this,"提示","项目创建成功,但没有选择可执行文件,\n建议将可执行文件的内容复制\n到ExcuteFile文件夹下");            }            //新建项目文件pro            QFile pro_file( project_dir.filePath(project_name__+".pro") );            pro_file.open(QFile::WriteOnly|QIODevice::Text);            pro_path_.append(pro_file.fileName());//添加pro文件            QTextStream pro_stream(&pro_file);            pro_stream<<"Project was created successfully!\n";            pro_stream<<"PROJECT NAME = "<<project_name__<<"\n";//添加项目名            pro_stream<<"PROJECT DIR = "<<_project_dir_<<"\n";//添加项目路径            pro_stream<<"PROJECT FILE NAME = "<<pro_file.fileName()<<"\n";//添加pro文件名的路径            pro_stream<<"EXCUTE FILE = "<<_excute_dir_;//添加可执行文件的路径            //创建树形条            QTreeWidgetItem *item=new QTreeWidgetItem(ui->treeWidget,QStringList(project_name__));//添加节点            //添加子节点            QTreeWidgetItem *item1=new QTreeWidgetItem(item,QStringList(QString("执行参数")));            item->addChild(item1);            QTreeWidgetItem *item2=new QTreeWidgetItem(item,QStringList(QString("可执行文件")));            item->addChild(item2);            QTreeWidgetItem *item3=new QTreeWidgetItem(item,QStringList(QString("后处理")));            item->addChild(item3);            ui->treeWidget->expandAll();//展开所有节点        }    }}


3.打开项目

//打开项目槽函数void MainWindow::open_project(){    QString file_path_=QFileDialog::getOpenFileName(this,".打开项目");    QFile file(file_path_);    file.open(QIODevice::ReadOnly|QIODevice::Text);    QByteArray str_line_;    QString temp;    file.readLine();    //项目名    str_line_=file.readLine();    temp=str_line_.mid(QString("PROJECT NAME = ").length(),str_line_.length()-QString("PROJECT NAME = ").length()-1);    project_name_.append(temp);    //创建树形条    QTreeWidgetItem *item=new QTreeWidgetItem(ui->treeWidget,QStringList(temp));//添加节点    //项目文件夹    str_line_=file.readLine();    temp=str_line_.mid(QString("PROJECT DIR = ").length(),str_line_.length()-QString("PROJECT DIR = ").length()-1);    project_dir_.append(temp);    //项目文件路径(pro)    str_line_=file.readLine();    temp=str_line_.mid(QString("PROJECT FILE NAME = ").length(),str_line_.length()-QString("PROJECT FILE NAME = ").length()-1);    pro_path_.append(temp);    //可执行文件所在文件夹    str_line_=file.readLine();    temp=str_line_.mid(QString("EXCUTE FILE = ").length(),str_line_.length()-QString("EXCUTE FILE = ").length());    excute_dir_.append(temp);    //添加子节点    QTreeWidgetItem *item1=new QTreeWidgetItem(item,QStringList(QString("执行参数")));    item->addChild(item1);    QTreeWidgetItem *item2=new QTreeWidgetItem(item,QStringList(QString("可执行文件")));    item->addChild(item2);    QTreeWidgetItem *item3=new QTreeWidgetItem(item,QStringList(QString("后处理")));    item->addChild(item3);    ui->treeWidget->expandAll();//展开所有节点}


4.总结

统观全文,基本上都是对字符串、目录、文件夹和文件的操作,用到的Qt类主要是QString和QDir。

原创粉丝点击