Qt君


  • 首页

  • 关于

  • 归档

  • 搜索

Vim技巧-替换文本

发表于 2019-05-15

一句命令替换文本内容。

步骤

  1. 切换到命令行模式
  2. 执行命令:%s/source/dest/g

解释

  • %代表指定范围从首行到尾;
  • s为substitude字符串替换的缩写;
  • source为原字符串,dest为替换后字符串;
  • g为对指定范围内的所有匹配项进行替换。

Qt环境变量接口

发表于 2019-05-14

使用Qt的qputenv与qgetenv接口操作程序环境变量。

获取环境变量接口

1
2
3
QByteArray qgetenv(const char *varName)
QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
QString qEnvironmentVariable(const char *varName)

设置环境变量接口

  • varName环境变量名字。
  • value环境变量的值。
    1
    bool qputenv(const char *varName, const QByteArray &value)

相关接口

  • 判断varName环境变量是否存在。(相当于!qgetenv(varName).isNull())

    1
    bool qEnvironmentVariableIsSet(const char *varName)
  • 判断varName环境变量是否为空。(相当于qgetenv(varName).isEmpty())

    1
    bool qEnvironmentVariableIsEmpty(const char *varName)

解决QML debugging is enabled.Only use this in a safe environment.警告

发表于 2019-05-13

解决Qml程序中一个非常常见的警告QML debugging is enabled.Only use this in a safe environment.

为什么会有这个警告?

  • 由于在Qt5以上版本默认开启QML调试器造成的。用于告知用户,这将打开一个到运行QML的Javascript解释器的端口,以便从中获得调试输出。显然,这会造成一个安全漏洞,所以在不安全的地方使用时应该关闭它(在释放运行时自动关闭)。这个警告是为了提醒你这一点。

注意

  • Qt4默认不开启QML调试器,而Qt5版本以上默认开启。
  • 如果您不使用QML,无论如何都要关闭它。
  • 由于开启QML调试需要在TCP端口打开套接字,这存在安全风险。Internet上的任何人都可以连接到正在调试和执行任何JavaScript函数的应用程序。因此,您必须确保端口受到防火墙的适当保护。

解决方法

  1. 在项目文件(.pro)添加DEFINES += QT_QML_DEBUG_NO_WARNING(只关闭打印输出,并不能关闭QML调试器)。
  2. 直接关闭QML调试器:

    1
    2
    Qt4版本: CONFIG -= declarative_debug
    Qt5版本: CONFIG -= qml_debug
  3. 在界面”项目”->”构建步骤”->”Enable QML debugging and profiling”复选框取消勾选;

  4. 使用release版本编译,因为release编译版本默认禁用QML调试器。

C/C++黑魔法-字符串字面量

发表于 2019-05-12

字符串字面量(string literal)是指双引号引住的字符,双引号中可以没有字符,也可以有很多个字符。使用字符串字面量可以快速得到需要的一些编码字符。

1. 字面量列表

语法 示例 解释
“(未转义字符\ 转义字符)” “示例” 窄多字节字符串字面量
L”(未转义字符\ 转义字符)” L”示例” 宽字符串字面量,
为了支持汉语等语言。
u8”(未转义字符\ 转义字符)” u8”示例” UTF-8 编码的字符串字面量。
(C++11起新增)
u”(未转义字符\ 转义字符)” u”示例” UTF-16 编码的字符串字面量。
(C++11起新增)
U”(未转义字符\ 转义字符)” U”示例” UTF-32 编码的字符串字面量。
(C++11起新增)
前缀(可选)R”分隔符(原始字符)分隔符” R”prefix(示例)prefix”
或R”(示例)”
原始字符串字面量。
(C++11起新增)

2. 关于L"..."字面量

  • 类型: const wchar_t[N],其中N是执行范围编码的代码单元中的字符串大小,包括空终止符。

3. 关于R"..."字面量

  • R为原始字符串字面量,用于避免转义任何字符。该字面量分隔符间的任何内容都成为字符串的一部分。
  • 例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <iostream>
    int main(int argc, char *argv[])
    {
    const char *longString = R"(
    This is
    a very
    long
    string.
    )";

    std::cout<<"====="<<std::endl;
    std::cout<<longString<<std::endl;
    std::cout<<"====="<<std::endl;

    return 0;
    }
  • 输出:

    1
    2
    3
    4
    5
    6
    7
    8
    =====

    This is
    a very
    long
    string.

    =====
  • 由于R"(的后面与)"的前面都使用了换行,所以输出两个空换行。

4. 参考内容

1
https://en.cppreference.com/w/cpp/language/string_literal

Qml函数重载

发表于 2019-05-11

介绍Qml子控件(Main.qml)重载父控件(Test.qml)的foo函数重载的使用方法。

1 使用方法

  • 子控件的根路径写相同的函数即可重载。

2 示例

  • Test.qml初始化中执行foo函数,由于子控件重载了该函数即为执行子控件的foo函数。
  • 运行程序输出: =====
  • Main.qml

    1
    2
    3
    4
    5
    Test {
    function foo() {
    console.log("=====")
    }
    }
  • Test.qml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import QtQuick 2.0

    Item {
    Component.onCompleted: foo()

    function foo() {
    console.log("+++++")
    }
    }

QtCtreator为程序添加运行参数

发表于 2019-05-11

一张图片告诉你怎么操作。

步骤

  1. 选择项目;
  2. 点击run按钮;
  3. 在Command line arguments栏输入参数(列表)。
    示例图片

malloc与calloc

发表于 2019-05-10

在gcc编译器中malloc与calloc它们都是实现内存分配。但是也有点小区别,就是malloc分配内存不会将数据清零,而calloc则会将数据清零。

源码

  • bzero(ptr, nelem * elsize)是将ptr的前nelem * elsize个字节置为0。
  • gcc-4.7.1 calloc函数源代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /* calloc -- allocate memory which has been initialized to zero.
    This function is in the public domain. */

    /*

    @deftypefn Supplemental void* calloc (size_t @var{nelem}, size_t @var{elsize})

    Uses @code{malloc} to allocate storage for @var{nelem} objects of
    @var{elsize} bytes each, then zeros the memory.

    @end deftypefn

    */

    #include "ansidecl.h"
    #include <stddef.h>

    /* For systems with larger pointers than ints, this must be declared. */
    PTR malloc (size_t);
    void bzero (PTR, size_t);

    PTR calloc (size_t nelem, size_t elsize)
    {
    register PTR ptr;

    if (nelem == 0 || elsize == 0)
    nelem = elsize = 1;

    ptr = malloc (nelem * elsize);
    if (ptr) bzero (ptr, nelem * elsize);

    return ptr;
    }

Qt技巧-枚举与字符串互相转换

发表于 2019-05-09

利用Qt元对象系统的特性实现对枚举类型与字符串的互相转换功能。

1 使用方法

  1. 项目文件添加QT += core;
  2. 创建类Car继承于QObject并使用Q_OBJECT宏;
  3. 类内添加枚举Color;
  4. 使用Q_ENUM宏将Color枚举注册到元对象系统中;
  5. 使用QMetaEnum::fromType获取枚举的QMetaEnum对象;
  6. 使用valueToKey或keyToValue进行转换操作。

2 枚举转字符串

  • 接口:

    1
    const char *QMetaEnum::valueToKey(int value) const
  • 输入: value为枚举值;

  • 输出: 枚举的字符串形式(没有找到枚举值返回空字符串)。

3 字符串转枚举

  • 接口:

    1
    int QMetaEnum::keyToValue(const char *key, bool *ok = nullptr) const
  • 输入: key为枚举字符串;

  • 输出: 返回值为枚举值,ok值为是否转换成功(需要做判断)。

4 注意事项

  • 暂不推荐在cpp文件内创建继承于QObject的类或使用Q_OBJEC宏。

5 示例

  • Car.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <QObject>

    class Car : public QObject
    {
    Q_OBJECT
    public:
    Car(QObject *parent = 0) {}
    ~Car() {}

    enum Color { RED, GREEN, BLUE };
    Q_ENUM(Color)
    };
  • main.cpp部分代码

    1
    2
    3
    4
    5
    6
    QMetaEnum metaColor = QMetaEnum::fromType<Car::Color>();

    bool isOk = false;
    qDebug()<<metaColor.valueToKey(Car::BLUE);
    qDebug()<<metaColor.keyToValue("BLUE", &isOk)<<isOk; // OR
    qDebug()<<metaColor.keyToValue("Car::BLUE", &isOk)<<isOk;

Vim技巧-使用系统剪切板

发表于 2019-05-08

介绍怎么使用Vim对系统剪切板进行复制粘贴的操作。

命令行模式下执行

  • 复制到系统剪切板"+y
  • 从系统剪切板粘贴到编辑器"+p

Qml按键事件传递

发表于 2019-05-07

以示例说明Qml界面按键事件传递方式。

示例

  • 按下按键,由于first对象event.accepted = true隔断了事件的向上(父控件)传递;
  • 传递方式为由顶层(子控件)传向底层(父控件)。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Rectangle {
    id: second
    anchors.fill: parent
    Keys.onPressed: {
    console.log("Second Event")
    }

    Rectangle {
    id: first
    anchors.fill: parent
    focus: true
    Keys.onPressed: {
    console.log("First Event")
    event.accepted = true
    }
    }
    }
1…192021…32
Qt君

Qt君

313 日志
41 标签
© 2019 Qt君
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
粤ICP备 - 16070052号