Qt君


  • 首页

  • 关于

  • 归档

  • 搜索

C/C++黑魔法-隐含的this指针

发表于 2019-05-06

从一个编译错误去理解this指针。

编译错误的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Car {
public:
const int &weight()
{
return m_weight;
}

private:
int m_weight;
};

int main(int argc, char *argv[])
{
const Car car;
int weight = car.weight();

return 0;
}
  • 编译后会出现以下错误:
    1
    main.cpp:15: error: C2662: “const int &Car::weight(void)”: 不能将“this”指针从“const Car”转换为“Car &”

为什么会这样?

  • 编译器里面const int &weight()与const int &weight(Car *this)是等价的;
  • 因为Car类的weight函数虽然没有参数传入,但实际上编译器自动隐含的传入this指针;
  • 由于const Car car被申明为常量实例,导致car实例所引用的weight函数的this指针也需要为const修饰;

怎么做?

  • 将const int &weight()改为const int &weight() const即可。

总结

  • const int &weight() const中,第一个const修饰weight返回值,第二个const修饰this指针;
  • 常量类只能访问使用const修饰的函数。

Qml信号绑定函数

发表于 2019-05-05

使用Qml中的信号绑定函数。

步骤

  1. 定义信号signal mySignal();
  2. 定义需要绑定的函数function func();
  3. 连接信号到函数function func();
  4. 触发信号onClicked: root.mySignal()。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Rectangle {
width: 100; height: 100
signal mySignal();
Component.onCompleted: mySignal.connect(func)

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

MouseArea {
anchors.fill: parent
onClicked: root.mySignal()
}
}

获取路径文件的后缀名字

发表于 2019-05-04

使用QFileInfo获取路径文件的名字与后缀

测试文件"/tmp/file.tar.gz"

1 获取文件名

  • 返回不带名字的file

    1
    QString QFileInfo::baseName() const
  • 返回名字和后缀file.tar.gz

    1
    QString QFileInfo::fileName() const

2 获取文件后缀

  • 返回"gz"

    1
    QString QFileInfo::suffix() const
  • 返回"tar.gz"

    1
    QString QFileInfo::completeSuffix() const

QDir过滤文件的坑

发表于 2019-05-03

以QDir过滤文件为例,怎么正确过滤.与..的目录。

错误做法

1
QStringList files = dir.entryList(QDir::NoDotAndDotDot);

正确做法

1
QStringList files = dir.entryList(dir.filter() | QDir::NoDotAndDotDot);

QDir::Filters

  • 此枚举描述QDir可用的筛选选项; 使用在entryList()和entryInfoList();
  • 过滤器值是通过使用按位或运算符组合的值来指定的。

使用QFileSystemWatcher监视文件目录变化

发表于 2019-05-02

使用QFileSystemWatcher类用于监视文件和目录的修改。

使用方法

  1. 添加需要监视的文件或目录

    1
    2
    bool addPath(const QString &path);
    QStringList addPaths(const QStringList &paths);
  2. 监听信号的变化

    1
    2
    void directoryChanged(const QString &path);
    void fileChanged(const QString &path);

示例

  • MyFileWatcher.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #ifndef MYFILEWATCHER_H
    #define MYFILEWATCHER_H

    #include <QObject>
    #include <QFileSystemWatcher>

    class MyFileWatcher : public QObject
    {
    Q_OBJECT
    public:
    explicit MyFileWatcher(QObject *parent = nullptr);

    public slots:
    void onFileChanged(const QString &file);
    void onDirectoryChanged(const QString &path);

    private:
    QFileSystemWatcher m_fileWatcher;
    };

    #endif // MYFILEWATCHER_H
  • MyFileWatcher.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include "MyFileWatcher.h"
    #include <QDebug>

    MyFileWatcher::MyFileWatcher(QObject *parent) : QObject(parent)
    {
    m_fileWatcher.addPath("C:/Documents/test.txt"); // monitoring file
    m_fileWatcher.addPath("C:/Documents/test"); // monitoring directory

    connect(&m_fileWatcher, SIGNAL(fileChanged(const QString&)), this, SLOT(onFileChanged(const QString &)));
    connect(&m_fileWatcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(onDirectoryChanged(const QString &)));

    qDebug()<<"Monitoring File:"<<m_fileWatcher.files();
    qDebug()<<"Monitoring Directory:"<<m_fileWatcher.directories();
    }

    void MyFileWatcher::onFileChanged(const QString &file)
    {
    qDebug()<<"File Changed:"<<file;
    }

    void MyFileWatcher::onDirectoryChanged(const QString &path)
    {
    qDebug()<<"Directory Changed:"<<path;
    }

Qt正则表达式一些注意的地方

发表于 2019-05-01

介绍使用Qt正则表达式的一些注意的地方。

1. 需要转义的字符本身也可能需要转义

例如:

  • \d需要写成\\d
  • .需要写成\\.

2. Qml中的正则表达式中

  • RegExpValidator控件的regExp应该是JS语法中的正则表达式,例如/a/对于匹配”a”的正则表达式。

QFileInfo找快捷方式的原指向

发表于 2019-04-30

使用QFileInfo的symLinkTarget接口找快捷方式的原指向。

接口

  • exists判断文件是否存在;
  • isSymLink判断是否为快捷方式,注意:在Windows系统下路径后缀以*.lnk结尾都会被判断为快捷方式(无论该文件是否存在);
  • symLinkTarget返回快捷方式的原指向

示例

  • 先判断文件是否存在,再判断是否是快捷方式。
    1
    2
    3
    QFileInfo info("C:/Document/text.lnk");
    if (info.exists() && info.isSymLink())
    qDebug()<<"Source Path: "<<info.symLinkTarget();

不正确的示例

  • 当C:/Document/text.lnk快捷方式不存在时,由于没有判断文件存在,最终会打印一个空的字符串。
    1
    2
    3
    QFileInfo info("C:/Document/text.lnk");
    if (info.isSymLink())
    qDebug()<<"Source Path: "<<info.symLinkTarget();

Webrtc回声消除模式(Aecm)屏蔽适宜噪音(CNG)

发表于 2019-04-29

舒适噪音生成CNG(comfort noise generator)是一个在通话过程中出现短暂静音时用来为电话通信产生背景噪声的程序。

音频版本VoiceEngine 4.1.0

  • 默认情况下andriod与ios会使用Aecm模式;
    1
    2
    3
    4
    5
    #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
    static const EcModes kDefaultEcMode = kEcAecm;
    #else
    static const EcModes kDefaultEcMode = kEcAec;
    #endif
1
2
3
4
5
6
7
8
9
// EC modes
enum EcModes // type of Echo Control
{
kEcUnchanged = 0, // previously set mode
kEcDefault, // platform default
kEcConference, // conferencing default (aggressive AEC)
kEcAec, // Acoustic Echo Cancellation
kEcAecm, // AEC mobile
};

SetAecmMode接口

  • 只需要将enableCNG为false即可屏蔽舒适噪音。
    1
    2
    3
    // Modifies settings for the AEC designed for mobile devices (AECM).
    virtual int SetAecmMode(AecmModes mode = kAecmSpeakerphone,
    bool enableCNG = true) = 0;

Vim技巧-快速/取消注释

发表于 2019-04-28

本文介绍如何使用Vim对文本进行快速注释或快速取消注释。

快速注释

  1. 按ESC进入命令行模式;
  2. ctrl+v进入块选择模式;
  3. 操作k和j进行上下行选择;
  4. 按大写I进入插入模式,输入注释符//或#(shell脚本注释符);
  5. 最后按下ESC即可完成注释。

取消注释

  1. 按ESC进入命令行模式;
  2. ctrl+v进入块选择模式;
  3. 操作k和j进行上下行选择,还可以操作h和l键进行左右控制;
  4. 按d键删除注释符;
  5. 最后按下ESC即可完成取消注释。

总结

  • 大写I为在光标处插入;
  • 利用Visual-Block模式进行列选择,进而便捷地操作代码注释和取消注释。

Qml之DropArea示例

发表于 2019-04-27

DropArea是一个不可见的项,当其他项(文件,文件夹等)被拖动到它上面时,它将接收到事件。

示例

  • onEntered为拖拽到(鼠标进入)控件触发事件;
  • onDropped为拖拽到控件后(鼠标松手后)触发事件;
  • drag和drop分别为onEntered和onDropped事件可捕抓到的内容;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DropArea {
anchors.fill: parent;
onEntered: {
if (drag.urls.length !== 1) { // 过滤事件,只能拖拽一个项目
drag.accepted = false
return false;
}
}

onDropped: {
console.log(drop.urls.length);
for(var i = 0; i < drop.urls.length; i++){
console.log(drop.urls[i]);
}
}
}
1…202122…32
Qt君

Qt君

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