SpringMvc 的请求中的参数(字符串)默认是不能自动地转换为日期的,需要使用 Converter, InitBinder 或者 Formatter 来把请求中的参数转换为日期。
大圣,此去欲何?踏南天,碎凌霄。若一去不回…… 便一去不回!
SpringMvc 的请求中的参数(字符串)默认是不能自动地转换为日期的,需要使用 Converter, InitBinder 或者 Formatter 来把请求中的参数转换为日期。
如果限制一个程序同时只能启动一个实例,有几个可以使用的库
QtSingleApplication
以前可以免费使用,后来只有商业版能里能用,在 Github 上也有一个 LGPL 协议的实现,地址为 https://github.com/qtproject/qt-solutions/tree/master/qtsingleapplication
SingleApplication
This is a replacement of the QSingleApplication for Qt5,地址为 https://github.com/itay-grudev/SingleApplication
RunGuard
使用共享内存、简单、轻量化的实现,缺点是程序间不能通信,双击程序图标的时候不会激活已运行的实例显示到最前面,下面介绍 RunGuard 的使用
Qt 的信号槽在解耦方面做的非常好,sender 和 receiver 不需要互相知道,但是在使用 QObject::connect() 建立信号槽连接的时候是必须要同时知道 sender 和 receiver 的,这在绝大多数时候都是非常好用的,但是如果只想发送通知后,对此通知感兴趣的监听者就能自动的收到通知,同时还不用 QObject::connect() 建立信号槽连接,就可以使用下面介绍的 NotificationCenter
来实现。此外,NotificationCenter 内部已经处理好了跨线程通讯,不需要再考虑不同线程间函数调用的头疼问题。
NotificationCenter 的使用:
通知的监听器,不需要使用继承,只需要实现函数 notified
,当有通知的时候,notified
函数会被自动调用
1 | Q_INVOKABLE void notified(int notificationId, const QByteArray &data); |
监听某个通知,通知的标志是一个整数,可以根据业务随意定义
1 | Singleton<NotificationCenter>::getInstance().addObserver(1, &foo); |
发送通知, 只需要和 NotificationCenter 交互就能发送和接收通知
1 | Singleton<NotificationCenter>::getInstance().notify(1, QString("Two").toUtf8()); // 同线程发送消息 |
删除监听器,不再需要的时候,从 NotificationCenter 删除监听器,以免造成野指针异常
1 | Singleton<NotificationCenter>::getInstance().removeObserver(&foo); |
NotificationCenter 什么时候使用? 以 QTcpSocket 通讯为例:
使用信号槽和 NotificationCenter 都可以完成任务,但是 NotificationCenter 也是个不错的选择
文中的
监听器
,观察者
指的是同一个意思;消息
,通知
也是同一个意思。
ForkLift 连接 FTP: 菜单 Go > Connect...
,这种方式连接 FTP 不会自动记住密码,下次再连接时需要再次输入密码。
为了记住密码,可以使用 Favorites 来管理 FTP 的链接: Favorites > Show Favorites > +
,不要勾选 Ask
就可以了
读取下面 Json 文件 x.json 中 admin 属性下的 roles 属性,使用工具类 Json,支持带 “.” 的路径格式,代码如下
1 | Json json("x.json", true); |
如果使用原生的 QJsonDocument 来读的话,则代码如下
1 | QByteArray json; // json 的内容 |
相比之下,类 Json 简单很多,省去了很多繁杂的步骤。
Layer 是一款近年来备受青睐的 web 弹层组件,她具备全方位的解决方案,致力于服务各水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验,只依赖于 jQuery,提供了多种的弹出层选择,对 iframe 支持友好,可去其官网体验一下具体的例子 http://layer.layui.com
- LeanModal 是一个很简单的弹出层,虽然小,但是太过简陋
- 使用 Bootstrap 的时候,BootstrapDialog 是不错的选择,但是 Layer 还提供了 tips,msg 等特有的弹出层方式,更简单的自定义等。
在非 UI 线程中更新 UI (例如改变 QLabel 的文本) 应该使用 信号槽
或者 QMetaObject::invokeMethod()
,不要直接调用 widget 的函数,例如在非 UI 线程中直接调用 QLabel::setText(text)
就有可能让程序崩溃。有意思的是 Qt 4 时程序会直接奔溃退出,很容易发现问题,但在 Qt 5 里有时候没问题,有时候会在控制台有警告,有时候程序会退出,导致问题隐藏的比较深,所以最好的办法就是遵守规则不要直接调用,下面的程序展示了相关测试代码。
Because of limitations inherited from the low-level libraries on which Qt’s GUI support is built, QWidget and its subclasses are not reentrant. One consequence of this is that we cannot directly call functions on a widget from a secondary thread. If we want to, say, change the text of a QLabel from a secondary thread, we can emit a signal connected to QLabel::setText() or call QMetaObject::invokeMethod() from that thread. For example:
1 | void MyThread::run() { |