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

来源:互联网 发布:javascript 时间差计算 编辑:程序博客网 时间:2024/06/03 18:52

DevBean's World

Colorful Technologies…

导航器位于 Qt Creator 的左侧。我们可以在这里查看项目、文件、书签等内容。边侧栏 side bar 则是导航器中的一个组件。请注意下面的截图,红色方框中的就是导航器,而红色短线标示出的是用于选择导航器的下拉框。另外,Qt Creator 可以将导航器分成几个部分,正如图中所示,在“项目”下面还有一个“打开文件”面板:

Qt Creator 导航器

本节我们将学习如何创建 Qt Creator 的新的导航器。

Core::INavigationWidgetFactory

Qt Creator 暴露出的核心对象之一就是 Core::INavigationWidgetFactory。我们可以在 plugins/corelib/inavigationwidgetfactory.h 中找到它的定义:

Language:  C++ (Qt)
0123456789101112131415161718192021222324252627282930313233343536373839
#ifndef INAVIGATIONWIDGET_H#define INAVIGATIONWIDGET_H #include <coreplugin/core_global.h>#include <QtCore/QObject>#include <QtCore/QList> QT_BEGIN_NAMESPACEclass QToolButton;class QKeySequence;class QWidget;QT_END_NAMESPACE namespace Core { struct NavigationView{    QWidget *widget;    QList dockToolBarWidgets;}; class CORE_EXPORT INavigationWidgetFactory : public QObject{    Q_OBJECTpublic:    INavigationWidgetFactory();    virtual ~INavigationWidgetFactory();     virtual QString displayName() const = 0;    virtual int priority() const = 0;    virtual QString id() const = 0;    virtual QKeySequence activationSequence() const;    virtual NavigationView createWidget() = 0;    virtual void saveSettings(int position, QWidget *widget);    virtual void restoreSettings(int position, QWidget *widget);}; } // namespace Core #endif // INAVIGATIONWIDGET_H

需要提供导航器的插件必须实现这个接口。除此之外,该插件还必须将实现该接口的类暴露出来(我们已经在前面的文章中详细探讨过这个问题。)

准备 Side Bar 组件

为了实现导航器,首先,我们需要创建一个用于导航器显示的组件。现在,我们计划实现一个用于 FTP 访问的导航面板。因此,我们要有一个这样的界面:

Qt Creator FTP SideBar UI

我们使用 Qt Designer 设计出界面,运行效果如下:

FTP Explorer

用户在文本输入框中输入 FTP 地址,点击 “Go” 按钮之后,FTP 的目录内容就会在下面的 QTreeView 中显示。我们将这个组件称为 FtpExplorerSideBar:

FTP Explorer 获取

注意,我们在打开某一节点时,会出现相应的“Fetching”,表示正在获取。

实现 FtpExplorerSideBar

FtpExplorerSideBar.h 声明如下:

Language:  C++ (Qt)
012345678910111213141516171819202122232425262728293031
#ifndef FTPEXPLORERSIDEBAR_H#define FTPEXPLORERSIDEBAR_H #include <QWidget> struct FtpExplorerSideBarData; class QUrl; namespace Ui {    class FtpExplorerSideBar;} class FtpExplorerSideBar : public QWidget{    Q_OBJECT public:    explicit FtpExplorerSideBar(QWidget *parent = 0);    ~FtpExplorerSideBar();     void setUrl(const QUrl& url);    QUrl url() const; private slots:    void on_goButton_clicked(); private:    FtpExplorerSideBarData* d;}; #endif // FTPEXPLORERSIDEBAR_H

FtpExplorerSideBar.cpp 文件中,首先是 FtpExplorerSideBarData 的定义:

Language:  C++ (Qt)
01234
struct FtpExplorerSideBarData{    FtpDirModel* model;    Ui::FtpExplorerSideBar ui;};

构造函数中初始化 UI,然后将 view 与 model 关联起来:

Language:  C++ (Qt)
01234567
FtpExplorerSideBar::FtpExplorerSideBar(QWidget *parent) :    QWidget(parent){    d = new FtpExplorerSideBarData;    d->ui.setupUi(this);    d->model = new FtpDirModel(this);    d->ui.ftpView->setModel(d->model);}

析构函数中将 d 指针删除:

Language:  C++ (Qt)
0123
FtpExplorerSideBar::~FtpExplorerSideBar(){    delete d;}

URL 的 getter 和 setter 设置 URL 信息:

Language:  C++ (Qt)
012345678
void FtpExplorerSideBar::setUrl(const QUrl& url){    d->model->setUrl(url);} QUrl FtpExplorerSideBar::url() const{    return d->model->url();}

点击“Go”按钮后,会自动调用 on_goButton_clicked() 函数(这是隐式的 signal-slot 连接):

Language:  C++ (Qt)
01234
void FtpExplorerSideBar::on_goButton_clicked(){    QUrl url(d->ui.ftpPathEdit->text());    d->model->setUrl(url);}

现在,我们的 FtpExplorerSideBar 已经编写完成。

注意,我们创建了 FtpDirModel 类,作为 QTreeView 的 model。这个类实现了组件与 FTP 的连接,是核心类之一,但是其编写已经远远超出本文的写作目的。FtpExplorerSideBar 完整代码已经放在文末的附件中,如果有不明白的地方或者需要对 FtpDirModel 进行解释,请在后面留言。FtpDirModel 原始版本在这里,再次表示感谢!

附件下载:FtpExplorerSideBar 文件