3.1K 
Item Model 类向导
假设我们希望提供一个新的类向导,来帮助我们自动生成一个数据项模型的文件。这个文件将基于如下几个数据:
- 模型类名称;
- 父类名称(可以是
QAbstractItemModel、QAbstractListModel或者QAbstractTableModel中的一个); - 头文件名;
- 源代码文件名。
下面,我们就来为 Qt Creator 提供这个“数据项模型”类向导。
第一步:设计类向导界面
首先,我们需要使用 Qt Designer 设计一个简单的界面,目的是向用户搜集我们上面提到的所需要的各个数据:

这个界面被命名为 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;
}