化石原创文章,转载请注明来源并保留原文链接


没想到居然没找到官方自带这个功能的!根据原理,写了一个如下转换的:

DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse("1605744000000" + "0000");
TimeSpan deltaTime = new TimeSpan(lTime);
DateTime dt = dtStart.Add(deltaTime);

代码第一行是1970年1月1日,也就是Unix stamp定义的起始。

第二行第一个参数是一个13位的时间戳,后面加上0000是省了后续的放大10000倍。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


1、符合单个、多个字段的计数

使用Repository方式,继承的MongoRepository中,有接口count,这个方法返回一个集合中所有Document的数量。

如果需要返回指定字段的数量,使用countBy方式,假设字段名叫做userId,那么这个方法就需要命名为:

long countByUserId(String userId);

这种方式是底层的mongo代码决定的。所以要符合规则。

如果是多个字段,都要满足。就需要用上And字眼,比如:

long countByUserIdAndSalary(String userId, int salary);

类似关键字And的字眼,可以是Or(或者)等等。

参考:

https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.query


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


1、通过driver api自己操作

特点:

要写的代码多。不需要有什么规则,只要连接到数据库,CRUD、集合、排序等等都可以通过api搞定。

2、通过Reposity方式,产生数据集合映射(代码量少很多)

特点:

要写的代码相对少。需要通过Document(非必须)等注解来关联集合,写的model,service、repository等命名可能需要符合规则。

3、通过注解方式

特点:

要写的代码量少,需要符合规则。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


Qt的上下文菜单实现方式要根据Widget的contextMenuPolicy(这是Widget的一个成员变量)来定。

1、自定义菜单

先在Widget初始化的时候调用

setContextMenuPolicy(Qt::CustomContextMenu);

指定该widget的上下文菜单是自定义的。

这里的自定义并不是说上下文菜单随意摆置内容-菜单怎么显示本来就是自定义。而是:实现上下文的方式或者说流程不同。

这里的流程是:

当上下文的行为(大多是右键点击)产生时,Qt底层会发出

 customContextMenuRequested() 

这个信号。

该信号定义在QWidget中:

 Q_SIGNALS:
     void customContextMenuRequested(const QPoint &pos);

所以,我们要能得到上下文信号,只要做一个slot就可以。

这样,自定义形式下,就三步:

a、setContextMenuPolicy(Qt::CustomContextMenu);

b、连接信号和插槽,比如:

connect(this, SIGNAL (customContextMenuRequested(const QPoint&)), this, SLOT (contextMenu(const QPoint&)));

c、在插槽里实现具体的菜单内容,位置是信号传过来的。

应用场合:

QTableView继承类的上下文菜单

2、默认上下文菜单

这个相当于用

 setContextMenuPolicy(Qt::DefaultContextMenu ); 

此种状况下,如果Widget中有重写的

void contextMenuEvent(QContextMenuEvent* event);

方法。这个方法在对应的时候就会激发。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


做一个上下文菜单,大多菜单QAction引发的方法,都进入同一个触发方法,这样在方法中,这样能少写很多方法,代码也会简洁很多。引起的一个问题是:在这个方法中,必须知道是哪个QAction引发。

sender()方法就用来解决该问题,只要是QObject的子类,都包含该方法,这样,如果知道是QAction引发的方法调用,只要把send()返回的值强转为QAction,就能得到该QAction的text,如果text就能识别,那么就知道是哪个QAction激发了方法。

    QAction* action = qobject_cast<QAction*> (sender());
    int size = action->text().toInt();


化石原创文章,转载请注明来源并保留原文链接