Docker 容器的哲学是一个 Docker 容器只运行一个进程。

但如果需要在一个容器内运行多个进程或服务,可以采取将入口文件设置为 Bash Shell 脚本,在脚本内运行多个程序的方式。

阅读全文 »

默认构造函数

什么是默认构造函数?

我们一般会认为默认构造函数就是编译器自动生成的那个构造函数,其实这种理解不全面。
**准确的说,默认构造函数就是在调用时不需要显示地传入实参的构造函数。**根据这个原则,下面 2 种构造函数都是默认构造函数:

1
2
3
4
5
6
7
class Sample {
public:
// 默认构造函数。
Sample() {
// do something
}
};
1
2
3
4
5
6
7
class Sample {
public:
// 默认构造函数。虽然有形参,但有默认值,调用时可以不显式地传入实参。
Sample(int m = 10) {
// do something
}
};
阅读全文 »

条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。

阅读全文 »

本文主要介绍前后端及客户端开发中遇到的一些常用的技术概念,本文不会涉及太深奥的技术细节。

阅读全文 »

TypeScript 是 JavaScript 的一个超集,支持 ES6 的语法规范,并在此基础上进行了增强,二者最大的不同在于:TypeScript 是强类型语言,而 JavaScript 是弱类型的语言。

阅读全文 »

ECMAScript 标准的发展经历了一个漫长的过程,从 1997 年发布的ECMAScript 1.0,到 2011 年的ECMAScript 5.1,再到 2015 年的ECMAScript 2015,以及后面每年都会发布的一个新的 ECMAScript 版本,版本众多,而且每个版本都有新特性的加入。

阅读全文 »

Qt QSS 选择器和 CSS2、CSS3 的选择器类似,建议先学习或者复习 CSS 选择器的语法

QSS 虽然源自 CSS ,但也有稍许不同,而且支持的语法也没 CSS 那么多。

阅读全文 »

本文围绕 3 个问题来理解 C++的默认构造函数:

  1. 什么是默认构造函数?
  2. 默认构造函数什么时候被调用?
  3. 编译器在什么情况下会生成默认构造函数?
阅读全文 »

本文从实际需求出发,介绍了内存池的实现原理,并且提供了具体的实现方案。

为什么需要使用内存池

在 C/C++ 中我们通常使用 mallocfreenewdelete 来动态分配内存。
一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;

另一方面,频繁的分配和释放小块内存会导致大量的内存碎片的产生,当碎片积累到一定的量之后,将无法分配到连续的内存空间,系统不得不进行碎片整理来满足分配到连续的空间,这样不仅会导致系统性能损耗,而且会导致程序对内存的利用率低下。

当然,如果我们的程序不需要频繁的分配和释放小块内存,那就没有使用内存池的必要,直接使用malloc,freenew,delete函数即可。

阅读全文 »

移除Qt控件虚线框

方式一:使用 StyleSheet

1
2
3
QWidget:focus {
outline: none; /* 去掉得到焦点时的虚线框 */
}

方式二:继承 QProxyStyle

继承 QProxyStyle,PrimitiveElement 为 QStyle::PE_FrameFocusRect 时不绘制虚线框,然后在 main() 函数里调用 QApplication::setStyle() 使用新的样式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 文件名: NoFocusRectStyle.h
#ifndef NOFOCUSRECTSTYLE_H
#define NOFOCUSRECTSTYLE_H
#include <QProxyStyle>
class NoFocusRectStyle : public QProxyStyle
{
public:
NoFocusRectStyle(QStyle *baseStyle) : QProxyStyle(baseStyle) {}
void drawPrimitive(PrimitiveElement element,
const QStyleOption *option,
QPainter *painter,
const QWidget *widget = 0) const
{
if (element == QStyle::PE_FrameFocusRect)
{
return;
}
QProxyStyle::drawPrimitive(element, option, painter, widget);
}
};
#endif // NOFOCUSRECTSTYLE_H
1
2
3
4
5
6
7
8
9
10
11
12
13
// 文件名: main.cpp
#include "Widget.h"
#include "NoFocusRectStyle.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
NoFocusRectStyle *style = new NoFocusRectStyle(app.style());
app.setStyle(style); // Ownership of the style object is transferred to QApplication
Widget w;
w.show();
return app.exec();
}

无法拖入文件到QListWidget

一般而言,只需要做如下操作,QWidget即可支持拖入文件:

1
2
3
4
5
6
7
8
setDragDropMode(QAbstractItemView::DropOnly); // 仅支持拖入文件


// 重写dragEnterEvent,当拖入文件进入时被调用,可以在该函数中取消拖入操作
void dragEnterEvent(QDragEnterEvent* e) override;

// 重写dropEvent,当拖入文件并释放鼠标时被调用
void dropEvent(QDropEvent* e) override;

但在执行上述操作后,我们拖入文件到QListWidget时,却只能收到dragEnterEvent事件,却无法收到dropEvent事件。

阅读全文 »
0%