您当前的位置: 首页 >  qt

风间琉璃•

暂无认证

  • 2浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[QT入门篇]编程基础知识

风间琉璃• 发布时间:2022-07-14 09:49:47 ,浏览量:2

一、坐标体系

在 Qt 中窗口的显示是需要指定位置的,这个位置是通过坐标来确定的,所有坐标的选取都是基于坐标原点来确定的,Qt的坐标原点在窗口的左上角。

 在一个 Qt 窗口中一般都有很多子窗口内嵌到这个父窗口中,其中每个窗口都有自己的坐标原点,子窗口的位置也就是其使用的坐标点就是它的父窗口坐标体系中的坐标点。

在 Qt 的某一个窗口中有可能有若干个控件,这个控件都是嵌套的关系,A 窗口包含 B 窗口,B 窗口包含 C 窗口。每个窗口都有坐标原点,在左上角,子窗口的位置是基于父窗口的坐标体系来确定的,通过父窗口左上角的坐标点来确定自己的位置。Qt 中窗口显示的时候使用的相对坐标,相对于自己的父窗口将子窗口移动到父窗口的某个位置。

移动窗口函数:

// 参数 x, y是要移动的窗口的左上角的点, 窗口的左上角移动到这个坐标点
void QWidget::move(int x, int y);
void QWidget::move(const QPoint &);

ui->setupUi(this);
this->move(200,200); // 主窗口移动
//创建一个按钮,让这个按钮作为主窗口的子控件
QPushButton* bta = new QPushButton(this);
//移动按钮的位置
bta->move(10,10);
//设置按钮的大小
bta->setFixedSize(200,200);

 //创建按钮B,让这个按钮作为按钮A的子控件
 QPushButton* btb = new QPushButton(bta);
 btb->move(10,10);
 btb->setFixedSize(100,100);

 二、内存回收机制

QObject 是以对象树的形式组织起来的。当创建QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数(parent,父对象指针)。在创建 QObject 对象时,可以提供一个其父对象,创建的这个 QObject 对象会自动添加到其父对象的 children () 列表。当父对象析构的时候,列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类)

QWidget 是能够在屏幕上显示的一切组件的父类。QWidget 继承自 QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。

当用户关闭一个对话框的时候,应用程序将其删除,那么,属于这个对话框的按钮、图标等应该一起被删除,因为这些都是对话框的子组件。

Qt 引入对象树的概念,在一定程度上解决了内存问题。

当一个 QObject 对象在堆上创建的时候,Qt 会同时为其创建一个对象树。对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的 children () 列表中删除;如果有孩子,则自动 delete 每一个孩子。

 Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收:

①创建的对象必须是 QObject 类的子类 

QObject 类是没有父类的,Qt 中大部分类都是从这个类派生出去的,Qt 中使用频率很高的窗口类和控件都是 QObject 的直接或间接的子类

②创建出的类对象,必须要指定其父对象

指定父对象有两种方式:

// 方式1: 通过构造函数
// parent: 当前窗口的父对象, 找构造函数中的 parent 参数即可
QWidget::QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QTimer::QTimer(QObject *parent = nullptr);

// 方式2: 通过setParent()方法
// 假设这个控件没有在构造的时候指定符对象, 可以调用QWidget的api指定父窗口对象
void QWidget::setParent(QWidget *parent);
void QObject::setParent(QObject *parent);

三、Qt数据类型

Qt 是一个 C++ 框架,因此 C++ 中所有的语法和数据类型在 Qt 中都是被支持的,但是 Qt 中也定义了一些属于自己的数据类型。

Qt基本数据类型定义在头文件中。 

一般还是使用C++类型的数据类型。

四、调试输出

在 Qt 中进行 log 输出,Qt 框架提供了专门用于日志输出的类,头文件名为 。

qDebug()  QByteArray
[static] QByteArray QByteArray::fromStdString(const std::string &str);
// QByteArray -> std::string
std::string QByteArray::toStdString() const;


QString相关类型转换

// 将int, short, long, float, double 转换为 QString 类型
QString &QString::setNum(int n, int base = 10);
[static] QString QString::number(int n, int base = 10);

// 将 QString 转换为 int, short, long, float, double 类型
int QString::toInt(bool *ok = Q_NULLPTR, int base = 10) const;
double QString::toDouble(bool *ok = Q_NULLPTR) const;

// 将标准C++中的 std::string 类型 转换为 QString 类型
[static] QString QString::fromStdString(const std::string &str);
// 将 QString 转换为 标准C++中的 std::string 类型
std::string QString::toStdString() const;

// QString -> QByteArray
// 转换为本地编码, 跟随操作系统
QByteArray QString::toLocal8Bit() const;
// 转换为 Latin-1 编码的字符串 不支持中文
QByteArray QString::toLatin1() const;
// 转换为 utf8 编码格式的字符串 (常用)
QByteArray QString::toUtf8() const;

字符串拼接函数QString::arg()

QString QString::arg(const QString &a, 
          int fieldWidth = 0, 
          QChar fillChar = QLatin1Char( ' ' )) const;
QString QString::arg(int a, int fieldWidth = 0, 
          int base = 10, 
          QChar fillChar = QLatin1Char( ' ' )) const;
QString str = QString("时间:%1 温度:%2 湿度:%3")
            .arg("11:30").arg(37.3).arg(34);
    qDebug()使用上午/下午(大写) 描述上下午, 中文系统显示汉字

ap或a==>使用上午/下午(小写) 描述上下午, 中文系统显示汉字

时间格式化配合QString QTime::toString(const QString &format) const;可以实现时间格式的输出。

//获取时间
QTime t = QTime::currentTime();
QString time_str = t.toString("hh:mm:ss.zzz");
qDebug()            
关注
打赏
1665385461
查看更多评论
0.0403s