首页 Qt 统一样式-结合良好设计原则
文章
取消

Qt 统一样式-结合良好设计原则

写在前面

结合上一篇提到的界面风格统一的问题,ui界面美观是产品一个至关重要的优势,而界面美观最基础的一点就是风格统一。但在团队中界面设计往往由许多人共同完成,如果统一大家的样式就成了一个问题。 下文方法是项目过程自己摸索的方法,不知道成熟团队或者公司内部有没有更好的准则,仅供参考。

解决思路

以QDialog一个常用的组件为例。

  1. 首先,我们建立一个模板控件: 在这里插入图片描述 并搭建需要的框架: 在这里插入图片描述 这里我要达到的效果有: 在这里插入图片描述
  2. 然后看看较为重要的函数useFrame,正是这个函数开启了框架:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
	void MAP_DLG_TemplateDialog::useFrame(QWidget *widget, int w, int h)
{
    m_templateUI->setupUi(this);
    m_templateUI->m_extendableLayout->addWidget(widget);
    if(w != 0 && h != 0)
        this->resize(w, h);

    QFile qss(":/QSS/qss/TotalQSS.qss");
    if (qss.open(QIODevice::ReadOnly))
    {
        QString styleSheet = qss.readAll();
        setStyleSheet(styleSheet);
    }
    m_templateUI->m_templateTitleBar->setButtonStyle(TitleBarButtonFlag::NOFLAGICONANDMAXMINBUTTON);
    m_templateUI->m_templateTitleBar->setTitleIcon(QIcon(":/Icon/icon/world.png"));
    m_templateUI->m_templateTitleBar->setTitleBarTitle(u8"标题栏", Qt::AlignCenter);
    m_templateUI->m_templateTitleBar->setDragable(true);
    this->setWindowFlag(Qt::FramelessWindowHint);

    connect(m_templateUI->m_applicationButton, &QPushButton::clicked,
            this, &MAP_DLG_TemplateDialog::applicationHandle);
    connect(m_templateUI->m_cancelButton, &QPushButton::clicked,
            this, &MAP_DLG_TemplateDialog::cancelHandle);
}

代码非常简单,更多是特定需要的接口,核心只要调用了setupUi,通过启用ui文件搭建的框架,并以QSS渲染其中指定的部件。

  1. 用法参考注释如下:
/**
 * @brief The MAP_DLG_TemplateDialog class
 * 对话框模板类,可作为大部分对话框的父类;
 * 提供了一套对话框的自定义框架,暂时包括:
 * 1.自定义标题栏,具体API参见自定义标题栏头文件
 * 2.底部button box,提供“确定”,“取消”功能。
 * 3.边框样式以及相关QSS设置,详情参见ui文件的样式。
 * 用法:
 * 生成Qt的ui/h文件,选择QDialog父类;在生成的.h文件中更改继承父类为MAP_DLG_TemplateDialog;
 * 在构造函数(或者合适的位置),调用MAP_DLG_TemplateDialog的useFrame方法即可。
 * 参考MAP_DLG_CreateProject界面
 * 最后在工厂类中提供生成界面的函数,使用工厂类创建界面。
 * @see map_dlg\map_dlg_createproject.h
 */

举例: 在这里插入图片描述 其实这个思路本身,其实就是利用了多个ui的组合,把界面共有的部分提取出来搭建一个ui框架文件,特定逻辑则继承这个父类,再写自己的ui文件。 (可能是Qt默认生成一个.h一个.cpp一个.ui就默认了这种组织形式,但文件组织是自由的,只要弄清楚ui文件的本质是什么,也就是setupUi这个函数的作用)

额外

上面额外提到一点是工厂类,这是team里面一个成员提出的设计原则,所有界面的创建由专门的工厂类去负责(其实也就是把new dialog()这个放入一个函数里面!)。这点到底有没有意义,我暂时持保留意见。

最后

由于项目本身由整个团队完成,并不是开源项目,所以代码部分不敢大张旗鼓的粘贴进来分享,有什么疑问之处可向本人联系进行交流。 邮箱:861921648@qq.com.

本文由作者按照 CC BY 4.0 进行授权

Qt-统一样式爬的坑(参考统一样式的思路)

osg添加插件--爬坑之路 无法定位程序输入点于动态库上