Qt Creator 插件开发(14):添加新的导航器(续)

实现INavigationWidgetFactory

现在,我们开始实现INavigationWidgetFactory接口。这个类声明如下:

#ifndef FTPVIEWNAVIGATION_H
#define FTPVIEWNAVIGATION_H

#include <coreplugin/inavigationwidgetfactory.h>

class FtpViewNavigationWidgetFactory
      : public Core::INavigationWidgetFactory
{
public:
    FtpViewNavigationWidgetFactory() { }
    ~FtpViewNavigationWidgetFactory() { }
    Core::NavigationView createWidget();
    QString displayName() const;
    int priority() const;
    QString id() const;
};

#endif // FTPVIEWNAVIGATION_H

注意上一节,我们给出了Core::INavigationWidgetFactory的声明。Core::INavigationWidgetFactory有四个纯虚函数,我们必须依次实现:

createWidget()函数用于返回 Side Bar 组件,正如上一节我们说的那样:

Core::NavigationView FtpViewNavigationWidgetFactory::createWidget()
{
    Core::NavigationView view;
    view.widget = new FtpExplorerSideBar;
    return view;
}

displayName()函数返回 side bar 的名字。该名字会在导航器下拉框中显示:

QString FtpViewNavigationWidgetFactory::displayName() const
{
    return "Ftp View";
}

priority()id()用于返回组件优先级和 ID。这里我们仅给出一个默认实现:

int FtpViewNavigationWidgetFactory::priority() const
{
    return 0;
}

QString FtpViewNavigationWidgetFactory::id() const
{
    return "Ftp View";
}

实现插件

前面我们已经实现了很多个插件。我们也对插件的模式轻车熟路。因此,这里我们只给出插件类中的initialize()函数的实现:

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

    addAutoReleasedObject(new FtpViewNavigationWidgetFactory);

    return true;
}

注意,在initialize()函数中,我们创建了一个INavigationWidgetFactory实现的实例,然后将其添加到对象池中。一旦对象被添加到对象池,ExtensionSystem::PluginManager就会发出objectAdded()信号;该信号由 Qt Creator 核心监听。一旦核心获得这个信号,它就会利用我们提供的INavigationWidgetFactory接口的实现,将其添加到导航器面板。

最后测试一下我们的插件:

Qt Creator FTP View 导航

注意,我们现在已经把先前独立的FtpExplorerSideBar嵌入到导航器中。

保存和恢复边侧栏状态

回到上一节我们给出的INavigationWidgetFactory的代码。我们找到其中这么两个函数:

virtual void saveSettings(int position, QWidget *widget);
virtual void restoreSettings(int position, QWidget *widget);
  • saveSettings()函数用于保存组件设置。第二个参数就是该组件的指针。保存位置由Core::ICore:: settings()返回;
  • restoreSettings()函数用于恢复组件设置。

下面,我们为FtpViewNavigationWidgetFactory添加这一功能:

void FtpViewNavigationWidgetFactory::saveSettings(int position, QWidget *widget)
{
    FtpExplorerSideBar* ftpExp = qobject_cast(widget);
    if(!ftpExp)
        return;
    QSettings *settings = Core::ICore::instance()->settings();
    settings->setValue("FtpView.URL", ftpExp->url().toString());
}

void FtpViewNavigationWidgetFactory::restoreSettings(int position, QWidget *widget)
{
    FtpExplorerSideBar* ftpExp = qobject_cast(widget);
    if(!ftpExp)
        return;
    QSettings *settings = Core::ICore::instance()->settings();
    QString urlStr = settings->value("FtpView.URL").toString();
    ftpExp->setUrl( QUrl(urlStr) );
}

通过覆盖这两个函数,我们将 FTP Path 保存到 settings 中,第二次打开的时候就可以读取上次输入的值了。

附件下载:FtpViewNavigation 文件

2 Comments

  1. 卢松松 2011年11月29日
    • DevBean 2011年11月29日

Leave a Reply