实现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接口的实现,将其添加到导航器面板。
最后测试一下我们的插件:

注意,我们现在已经把先前独立的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 评论
不知道你属于程序员第几个阶段了?
正在学习阶段,还到不了什么高级别呢~嘻嘻