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

Qt Creator 中,新的工程类型将出现在“文件 -> 新建”菜单项中;我们可以通过打开的选择工程类型的对话框来找到所需要的工程:

Qt Creator 新建工程

在本章中,我们将学习如何向上面所示的对话框中添加新的工程类型。

Core::IWizard接口

Qt Creator 提供了Core::IWizard接口,用于实现添加新的工程类型。该接口在 src/plugins/coreplugin/dialogs/iwizard.h 中声明:

class CORE_EXPORT IWizard
    : public QObject
{
    Q_OBJECT
public:
    enum WizardKind {
        FileWizard = 0x01,
        ClassWizard = 0x02,
        ProjectWizard = 0x04
    };
    Q_DECLARE_FLAGS(WizardKinds, WizardKind)

    IWizard(QObject *parent = 0) : QObject(parent) {}
    virtual ~IWizard() {}

    virtual WizardKind kind() const = 0;
    virtual QIcon icon() const = 0;
    virtual QString description() const = 0;
    virtual QString displayName() const = 0;
    virtual QString id() const = 0;

    virtual QString category() const = 0;
    virtual QString displayCategory() const = 0;

    virtual void runWizard(const QString &path, QWidget *parent) = 0;

    // Utility to find all registered wizards
    static QList allWizards();
    // Utility to find all registered wizards of a certain kind
    static QList wizardsOfKind(WizardKind kind);
};

可以看出,Qt Creator 支持一下类型的向导:

  • File
  • Class
  • Project

Core::IWizard就是实现以上向导所必须实现的接口。

简单实现Core::IWizard

下面,我们自己实现IWizard接口,来添加一个新的工程类型“Custom Project”,目的是让我们的新的工程类型能够显示在“新建工程”对话框中。

实现Core::IWizard接口

首先,新建一个类CustomProjectWizard,实现Core::IWizard

#ifndef CUSTOMPROJECTWIZARD_H
#define CUSTOMPROJECTWIZARD_H

#include <coreplugin/dialogs/iwizard.h>

class QIcon;
class QString;
class QWidget;

class CustomProjectWizard : public Core::IWizard
{
public:
    CustomProjectWizard() { }
    ~CustomProjectWizard() { }

    Core::IWizard::WizardKind kind() const;
    QIcon icon() const;
    QString description() const;
    QString displayName() const;
    QString id() const;

    QString category() const;
    QString displayCategory() const;

    void runWizard(const QString &path, QWidget *parent);
};

#endif // CUSTOMPROJECTWIZARD_H

下面,我们将讨论每一个函数的实现。

函数kind()用于告诉 Qt Creator,我们实现的IWizard接口是哪种类型的。它的合法值就是前面所说的IWizard::WizardKind枚举。在我们的例子中,我们返回ProjectWizard

Core::IWizard::WizardKind CustomProjectWizard::kind() const
{
    return IWizard::ProjectWizard;
}

函数icon()返回一个图标,这个图标代表该工程,将会出现在新建对话框列表的左侧。在我们的例子中,我们直接返回 Qt Creator 的图标:

QIcon CustomProjectWizard::icon() const
{
    return qApp->windowIcon();
}

函数description()displayName()category()displayCategory()id()用于返回我们提供的新的工程类型的元数据,比如显示的名字、分类等。其中,以 display 开头的几个函数则用于在界面上显示的字符串,因此我们需要将其用tr()函数返回。

QString CustomProjectWizard::description() const
{
    return "A custom project";
}

QString CustomProjectWizard::displayName() const
{
    return tr("Custom Project");
}

QString CustomProjectWizard::id() const
{
    return "CustomProjectID";
}

QString CustomProjectWizard::category() const
{
    return "GalaxyWorld";
}

QString CustomProjectWizard::displayCategory() const
{
    return tr("GalaxyWorld");
}

当用户选择了“CustomProject”分类的时候,runWizard()函数将被调用。这个函数必须显示一个对话框,或者一个QWizard对象,用于向用户询问创建新的工程、文件或者类所必须的那些信息。在我们的示例中,这个函数仅仅显示一个对话框:

void CustomProjectWizard::runWizard(const QString &path, QWidget *parent)
{
    Q_UNUSED(path);
    Q_UNUSED(parent);

    QMessageBox::information(parent, "Custom Wizard Dialog", "Hi there!");
}

提供插件

至此我们已经完成自定义工程所需要的代码,下面就需要和前面一样,提供一个插件的封装:

bool CustomProjectWizardPlugin::initialize(const QStringList& args, QString *errMsg)
{
    Q_UNUSED(args);
    Q_UNUSED(errMsg);

    addAutoReleasedObject(new CustomProjectWizard);

    return true;
}

下面运行测试一下,就可以在新建对话框中发现我们增加的 Custom Project 类型:

Qt Creator 自定义工程

附件下载:CustomProjectWizardPlugin 文件

2 Comments

  1. ty 2013年1月30日
    • 豆子 2013年1月30日

Leave a Reply