pyqt 只能打开子窗口一次_Qt子窗口设计原则探讨

4456a2f70c5d05883814d8dec902fbf4.png

子窗口是界面程序中常见的部件之一。设计子窗口时,不仅要注意界面的美观、操作逻辑、人机交互等UI设计方面的内容,还应考虑程序设计方面的内容。本文从设计子窗口的几个典型环节来探讨Qt中子窗口的设计原则。

1.窗口的建立

Qt中建立子窗口的典型方法有两种:指针模式和局部变量模式。指针模式要求在父窗口类中保存子窗口的指针,需要显示子窗口时调用该指针,代码示例:

1b338699183087925ff69526b3273e4a.png

局部变量模式则是在需要的时候用局部变量实例化一个子窗口类,该变量作用域结束后子窗口随即销毁,代码示例:

4aab8f3927611f215f452ee8b723789a.png

我们从内存使用、窗口建立速度这两个角度来分析两种模式的特点。

(1)内存使用

指针模式保存子窗口指针的开销可以忽略。这种模式的主要特点是,子窗口建立后,关闭子窗口只是将其隐藏而不是销毁,如果不通过代码主动delete掉为子窗口分配的内存,那么这部分内存会一直被占用。如果设置了父对象,父对象析构时会释放这部分内存。

而局部变量模式中,子窗口一般在函数结束后被析构,不会一直驻留内存。

从内存使用方面来看,可以得出结论,如果子窗口的建立需要很大的内存开销,而程序内存资源较为紧张时,优先使用局部变量模式。当然也可以选择指针模式,然后添加代码,在适当的时机销毁子窗口,但这样更容易出错。

如下图中这个子窗口,建立后连接了数据库,占用了较多的系统资源,所以我们希望能及时的释放这些资源,所以采用了局部变量的模式。

daa33c083a0b5bce62176c91ceab6f37.png

(2)窗口建立速度

程序设计中时间和空间一般是一对矛盾。从内存使用的分析中可以看出,指针模式建立子窗口仅在第一次建立过程中需要花费较多时间,而后以驻留在内存中为代价获得了很快的建立速度。而局部变量模式的子窗口每次建立都要花费同样的时间。因此,如果软件中为了不影响用户体验,需要让某个复杂的子窗口有较快的建立速度,那么可以考虑使用指针模式。

2.数据交互

子窗口与主窗口的数据交互可以有以下几种:

(1)在子窗口类的构造函数中传递数据。此时子窗口类构造函数一般为如下形式:

d9713030d59909ded09bfd09e70c502e.png

子窗口通过主窗口传递过来的数据指针来获得和修改数据。这种方法适用于子窗口和主窗口有大量数据交互的情况。该方法封装性比较好,子窗口和主窗口仅通过Data来交互,调整代码时不易出错,代码结构也比较清晰。缺点是需要定义交互数据的结构。

如下图所示,这个子窗口和主窗口有较多的数据交互,所以我们使用了这种方法。

99309465aa3893a10ee404bac19684aa.png

(2)子窗口通过获得主窗口指针来调用主窗口的接口。代码一般如下所示:

4341852ac2cff4eb03d4cbf1b3a95be5.png

这种方法直接违反了接口隔离原则。一般情况下,子窗口仅需要用到主窗口的部分接口,而直接操作主窗口指针显然不合理。这种方法容易出错,一般不推荐使用。但该方法又比较简单,灵活性大,所以在项目中还是可以见到。

(3)使用指针模式时连接子窗口中的信号与主窗口中的槽,然后在槽函数中使用子窗口的指针来调用子窗口接口。因为子窗口类中的Ui部件一般是私有的,这时应当在子窗口类中添加接口或者将UI部件设为公有,以便于主窗口访问。这种方法在一些特殊情况下是不可替代的。典型的例子是实现查找窗口。当子窗口是非模态窗口时,可以考虑使用该方法交互数据。

(4)使用Qt的信号与槽机制。

这种适用场景有限,一般在子窗口操作较为简单时使用。如下图中这个子窗口,仅仅有两个选项,所以使用了这种方法。

7a659a66280dbc7aef744b81a91c23ea.png

从上文中分析中可以总结出设计子窗口的一般步骤:

(1)分析用户需求,设计合理的数据交互方式。

(2)根据用户需求与数据交互方式选择合适的窗口建立方式。

(3)实现子窗口的程序逻辑。

(4)美化子窗口界面,优化操作逻辑,提升用户体验。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值