Qt君


  • 首页

  • 关于

  • 归档

  • 搜索

Vim技巧-代码对齐

发表于 2019-04-26

分别介绍代码块对齐与全部对齐的方法。

单行代码对齐

  • 按ESC进入命令行模式;
  • 按==即可对齐单行代码。

代码块对齐

  • 按ESC进入命令行模式;
  • ctrl+v选中块;
  • 按j选择下一行,按k选择上一行;
  • 按=即可对齐选中代码。

全部对齐

  • 按ESC进入命令行模式;
  • 输入gg=G即可对齐。

总结

  • gg的意思为将光标移到文件开始位置;
  • G的意思为将光标移到文件结束位置;
  • =为代码对齐。

C/C++黑魔法-枚举骇客

发表于 2019-04-24

枚举的奇淫技巧!
枚举特性中: 枚举必须在编译时建立其所有值,并且其值可用于常量表达式。

1 在旧的编译器中以下代码不能编译通过

1
2
static const int length = 100;
int i[length];

2 利用枚举间接实现

1
2
3
4
struct Body {
enum { length = 100 };
int i[length];
};

3 枚举骇客的由来

  • static const不被编译器作常量支持,这一点令人费解。
  • 在编译器中不能被支持,利用枚举的特性来支持;
  • 枚举特性中:
    枚举必须在编译时建立其所有值,并且其值可用于常量表达式。

4 例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

struct Body {
enum { length = 100 };
int i[length];
};

int main()
{
cout << "sizeof(Body) = " << sizeof(Body)
<< "sizeof(int[100]) = " << sizeof(int[100]) << endl;

return 0;
}

5 最后

  • 猜猜结果输出是什么?

QML界面嵌入QWidget使用

发表于 2019-04-24

分别介绍Qt4与Qt5版本将QML界面嵌入到QWidget中使用。

Qt4使用方法

  • 项目文件添加QT += declarative
    1
    2
    3
    QDeclarativeView *view = new QDeclarativeView;
    view->setSource(QUrl::fromLocalFile("file.qml"));
    view->show();

Qt5使用方法

  • 项目文件添加QT += quickwidgets
    1
    2
    3
    QQuickWidget *view = new QQuickWidget;
    view->setSource(QUrl::fromLocalFile("file.qml"));
    view->show();

总结

  • 由于QDeclarativeView与QQuickWidget都是继承于QWidget,可以和QWidget一样的操作;
  • setSource函数能够将qml文件实例化,如果多次同样的URL调用则会重新实例化;
  • 本地文件需要使用QUrl::fromLocalFile。

Qml读文件内容

发表于 2019-04-23

利用qmlRegisterType接口注册一个文件操作类到Qml中,这样Qml就可以实现读写文件。

1 FileObject.h

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
#ifndef FILE_OBJECT_H
#define FILE_OBJECT_H

#include <QObject>

class FileObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)
public:
explicit FileObject(QObject *parent = 0);

Q_INVOKABLE QString read();
Q_INVOKABLE bool write(const QString& data);

void setSource(const QString& source) { m_source = source; };
QString source() { return m_source; }

signals:
void sourceChanged(const QString& source);

private:
QString m_source;
};

#endif // FILE_OBJECT_H

2 FileObject.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
25
26
27
28
29
30
31
32
33
34
35
36
#include "FileObject.h"

#include <QFile>
#include <QTextStream>

FileObject::FileObject(QObject *parent) :
QObject(parent)
{

}

QString FileObject::read()
{
QString content;
QFile file(m_source);
if ( file.open(QIODevice::ReadOnly) ) {
content = file.readAll();
file.close();
}

return content;
}

bool FileObject::write(const QString& data)
{
QFile file(m_source);
if ( file.open(QFile::WriteOnly | QFile::Truncate) ) {
QTextStream out(&file);
out<<data;
file.close();
return true;
}
else {
return false;
}
}

3 注册FileObject到Qml中

1
2
3
4
5
6
7
8
#include "FileObject.h"

Q_DECL_EXPORT int main(int argc, char *argv[])
{
...
qmlRegisterType<FileObject>("FileObject", 1, 0, "FileObject");
...
}

4 在Qml中使用FileObject实例

  • 读文件内容fileObject.read();
  • 写文件fileObject.write("Hello world!!!");
    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
    import QtQuick 1.1
    import FileObject 1.0

    Rectangle {
    width: 640
    height: 320

    Text {
    id: myText
    anchors.centerIn: parent
    }

    FileObject{
    id: fileObject
    source: "test.txt"
    }

    MouseArea {
    anchors.fill: parent
    onClicked: {
    fileObject.write("Hello world!!!");
    myText.text = fileObject.read();
    }
    }
    }

为什么枚举与整型不能互相转换?

发表于 2019-04-22

语法上它们可以互相转换,但在域的范围内并不能等同。

枚举语法糖果

  • 带类型的整型;
  • 域的范围比整型小。

为什么枚举能转换整型?

  • 枚举是整型子集,意味着枚举可以被整型一一对应,这就是为什么枚举能转换整型的原因了。

为什么整型不能转换为枚举?

  • 同理,由于枚举是整型的子集,导致整型不能一一对应枚举值导致实际编译器去确定的未知值;
  • 在实际操作中我们应该避免这一行为。

QUiLoader加载ui界面文件

发表于 2019-04-21

QUiLoader类允许你动态加载Qt设计的用户界面(ui)文件并创建实例。它加载基于XML的ui文件并实例化,而无需任何C++代码生成或编译。

使用方法

  • 基创建一个QUiLoader实例;
  • 然后调用其load()方法指定.ui文件(可以是文件或Qt资源).

例子

1
2
3
4
5
QUiLoader loader;
QFile file(":/myForm.ui");
file.open(QFile::ReadOnly);
QWidget *widget = loader.load(&file, this);
file.close();

C/C++黑魔法-三元运算符简洁写法

发表于 2019-04-20
  • 条件运算符也称为三元运算符。我们主要以下列形式使用它:
    x = (y < 0) ? 1 : 2;
  • 但是在C++中,您还可以通过以下方式使用它:
    (c < 0 ? a : b ) = 1; // 如果c < 0则a = 1; 如果c > 0则b = 1

C/C++黑魔法-三元运算符简洁写法

发表于 2019-04-20
  • 条件运算符也称为三元运算符。我们主要以下列形式使用它:
    x = (y < 0) ? 1 : 2;
  • 但是在C++中,您还可以通过以下方式使用它:
    (c < 0 ? a : b ) = 1; // 如果c < 0则a = 1; 如果c > 0则b = 1

Qml绑定特性

发表于 2019-04-19

在函数体内触发属性更新。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import QtQuick 2.0

Rectangle {
property int i: 0
width: 640
height: 480

Text {
text: changed()
}

Timer {
interval: 1000; running: true; repeat: true
onTriggered: i++
}

function changed() {
return i
}
}
  • 运行后出现的结果是text的值会不断+1;
  • 猜测情况下text: changed()应该为函数的返回值0,由于changed函数内存在外部变量就不一定是0了;

分析

  • qml绑定特性是绑定外部变量,外部变量变化触发信号更新,而信号的更新则会刷新text的值;
  • 使用qml的”:”右值为绑定表达式里面的外部变量。

Qml属性implicitWidth/Height与width/height区别

发表于 2019-04-18

implicitWidth与implicitHeight

  implicitWidth/Height一般用在可重用控件,它也不是必要的,QtQuick可以没有者两个属性,只因为了方便而存在。qt例子描述到什么情况下用到implicitWidth/height属性,就是Image。它提供了项目的自然大小的提示,但没有强制执行此大小。图像的自然尺寸将图像文件中的一个像素映射到屏幕上的一个像素。但它允许我们拉伸它,因此大小不会被强制执行并且可以被覆盖。另外有些控件直接设置width/height会造成性能损失(Text,TextEdit).

width与height

  width/height控件属性则为控件的宽度和高度。

另外

  • 如果没有设置width/height系统就会默认使用implicitWidth/Height。但是一般控件的implicitWidth/Height都为0。
  • 可以将implicitWidth/Height看做组件的推荐大小。
  • 在qml布局控件中使用layout.preferredWidth和layout.preferredHeight或implicitWidth和implicitHeight指定项目的首选大小。
1…212223…32
Qt君

Qt君

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