使用Qt开发笔记软件:Meownote(03)

现在我们已经有一个大致的界面。 加上可视化的东西,主要目的是为了让想像的样子逐步接近最终的样子, 同时开发流程更加直观:因为看到了,可能会觉得这里不错,那里设计不好。 这样的一个折腾过程,其实也能收获很多。

好了,我们继续。

缺少什么?

在导出一个主窗口供执行模块qtMeownote调用后,我感觉仍然是缺少一些东西。

想像一下,界面打开后,通常会显示一些当前数据,比如说,笔记本视图中会显示 我最近使用的笔记,状态栏显示一些当前笔记的统计信息等。 很明显,在将这些数据呈现出来之前,它们需要先被加载进来。 这种潜在意识,就表明程序需要一个恰当的执行流程。

对于我们的笔记软件,大致如下:

  • 双击程序启动
  • 加载数据
  • 创建界面
  • 显示初始数据
  • 用户操作
  • 退出清理。
  • 当然,你可能会想,我在创建界面的时候直接加载一些数据不行么?当然可以。 但这样可能会使后面的事情复杂化,有可能A界面需要B数据,但此时B数据却依赖X数据, 而X数据此时还未加加载。

    所以,不如在创建界面之前,把需要的初始化数据加载进来。 创建界面时,只需要读取即可。

    当然,你也可以决定在EXE模块中初始化数据,再创建窗口。 但这样一来,EXE会依赖mnMeownote与mnComponents两个模块 与我们划分的层关系有出入,但是,这仍然是可行的。 缺点就是将应用程序的周期划分到两个不同的地方实现了。

    引入App类

    为了这个流程,我引入了两个Application类, 是的两个!

  • mnMeownoteApp:这是一个导出类,由qtMeownote调用,完成整个应用程序的生命周期。 很明显,它是替代上次的主窗口类;同时,也保持EXE仅依赖mnMeownote模块。看下面的代码,其内部则封装了程序的运行周期,而且客户端很易于实现。
  • class mnMeownoteApp{public:    mnMeownoteApp(int &argc, char **argv);    ~mnMeownoteApp();    bool initialize();    void uninitialize();    int  run();};bool mnMeownoteApp::initialize(){    mnApplication *app = mnApplication::instance();    return app->init();}

    细心的你会注意到,没有数据!是的,为了让客户端知道的更少,采用一种代理策略:你要我干什么,我就让我兄弟去。很明显,我兄弟是一个单例模工。

  • mnApplication:这是真正的应用程序执行类,内部会维护程序主窗口,数据等。
  • class mnApplication : public QApplication{    Q_OBJECTpublic:    static mnApplication* instance()    {        return ms_instance;    }    mnApplication(int &argc, char **argv);    ~mnApplication();    bool init();    void release();private:    void setupStyleSheet();private:    static mnApplication *ms_instance;    mnMainWindow *m_mainWindow = nullptr;};

    经过这两步之后,程序的程序就完全掌控于当前模块之中了。这就是引入应用程序类的目的了。我们总结一下:

  • 组件模块导出应用程序接口代替原有导出窗口
  • 有利于组织程序初始化流程。
  • 样式表

    Qt可以很容易的实现外观美化。注意,我说的是美化,不是说超级酷炫,那估计自绘或QML更合适。现在为了验证一下我们的流程,顺带组织一下结构,这里我给出了一个加载样式表的过程。

    bool mnApplication::init(){    setupStyleSheet();    m_mainWindow = new mnMainWindow(nullptr);    m_mainWindow->show();    return true;}void mnApplication::setupStyleSheet(){    QString defaultThemeFile = applicationDirPath() + "/theme/default/default.qss";    QFile file(defaultThemeFile);    file.open(QFile::ReadOnly);    if (file.isOpen())    {        QString sheet = QLatin1String(file.readAll());        this->setStyleSheet(sheet);        file.close();    }}

    到这里之后,相比于界面外观,我们的内核升级了。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2020年5月2日
    下一篇 2020年5月2日

    相关推荐