Qt Creator 插件开发(21):添加新的工程类型(续二)

Item Model 类向导

假设我们希望提供一个新的类向导,来帮助我们自动生成一个数据项模型的文件。这个文件将基于如下几个数据:

  • 模型类名称;
  • 父类名称(可以是QAbstractItemModelQAbstractListModel或者QAbstractTableModel中的一个);
  • 头文件名;
  • 源代码文件名。

下面,我们就来为 Qt Creator 提供这个“数据项模型”类向导。

第一步:设计类向导界面

首先,我们需要使用 Qt Designer 设计一个简单的界面,目的是向用户搜集我们上面提到的所需要的各个数据:

ModelClassPage UI

这个界面被命名为 ModelNamePage.ui。

第二步:实现类向导页面

现在,我们将这个 UI 界面导入 Qt 类,从而可以获取到界面数据。首先,我们需要设计一个结构体,来保存所需数据:

struct ModelClassParameters
{
    QString className;
    QString headerFile;
    QString sourceFile;
    QString baseClass;
    QString path;
};

下一步,我们声明表示向导页的类,用于将前面我们做出的 UI 类加载进来,以便用户能够使用我们设计的界面来输入需要的内容:

#ifndef MODELNAMEPAGE_H
#define MODELNAMEPAGE_H

#include <QWizardPage>

struct ModelClassParameters
{
    QString className;
    QString headerFile;
    QString sourceFile;
    QString baseClass;
    QString path;
};

namespace Ui {
class ModelNamePage;
}

class ModelNamePage : public QWizardPage
{
    Q_OBJECT

public:
    explicit ModelNamePage(QWidget *parent = 0);
    ~ModelNamePage();

    void setPath(const QString& path);
    ModelClassParameters parameters() const;

private slots:
    void onClassNameChange(const QString & name);

private:
    Ui::ModelNamePage *ui;
    QString path;
};

#endif // MODELNAMEPAGE_H

构造函数和析构函数都是很简单的:

ModelNamePage::ModelNamePage(QWidget *parent) :
    QWizardPage(parent),
    ui(new Ui::ModelNamePage)
{
    ui->setupUi(this);
}

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

函数setPath()用于将文件路径存储下来:

void ModelNamePage::setPath(const QString& path)
{
    this->path = path;
}

槽函数onClassNameChange()根据用户填写的类名,自动生成对应的头文件和源代码文件的名字:

void ModelNamePage::onClassNameChange(const QString &name)
{
    ui->headerEdit->setText(name + ".h");
    ui->implEdit->setText(name + ".cpp");
}

最后, 函数parameters()用于返回ModelClassParameters实例,实际就是返回用户填写的数据:

ModelClassParameters ModelNamePage::parameters() const
{
    ModelClassParameters params;
    params.className = ui->classNameEdit->text();
    params.headerFile = ui->headerEdit->text();
    params.sourceFile = ui->implEdit->text();
    params.baseClass = ui->baseClassBox->currentText();
    params.path = path;
    return params;
}

Leave a Reply