实现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 评论
不知道你属于程序员第几个阶段了?
正在学习阶段,还到不了什么高级别呢~嘻嘻