元对象编译器 MOC(Meta Object Complile)
Qt 的 .cpp
程序和.h
程序可能或通过 MOC进行二次编译生成标准的C++程序,然后再有Makefile编程成可执行程序。
Qt 的信号和槽机制不是C++标准语法,他是基于Qt的元对象系统进行二次编译后才能够通过 编译器编译和使用。
Qt 元对象编译器的基础条件
- 类一定是QObject类派生出来的子类
- 类内必须包含 Q_OBJECT宏(通常写在类定义的第一行)
- 要安装Qt 的元对象编译器(在安装Qt时自动安装)。
使用元对象系统实现自定义的按钮
目标:使用 QWidget 实现自定的按钮功能:
mypushbutton.h
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include <QWidget>
class MyPushButton : public QWidget
{
Q_OBJECT
public:
explicit MyPushButton(QWidget *parent = nullptr);
protected:
// 重写 paintEvent来覆盖父类的 paintEvent
void paintEvent(QPaintEvent *event) override;
// 重写鼠标的按下和抬起的事件处理函数。
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private:
bool mouse_is_down; // 用来记下鼠标的状态。
signals:
void my_pressed();
};
#endif // MYPUSHBUTTON_H
mypushbutton.cpp
#include <QPainter>
#include <QDebug>
#include "mypushbutton.h"
MyPushButton::MyPushButton(QWidget *parent) : QWidget(parent)
, mouse_is_down(false)
{}
void MyPushButton::paintEvent(QPaintEvent *event)
{
// qDebug() << "paintEvent被调用";
// 创建一个 绘图对象 QPainter,用来绘制此Widget的内容
QPainter painter(this);
// 填充整个窗口为蓝色,rect() 函数用来返回当前窗口的位置和大小。
if (mouse_is_down) {
// painter.fillRect(rect(), QColor(255,255,0, 128));
painter.fillRect(rect(), Qt::red);
// painter.drawEllipse(rect());
} else {
painter.fillRect(rect(), Qt::blue);
}
}
void MyPushButton::mousePressEvent(QMouseEvent *event)
{
mouse_is_down = true;
// 强制调用paintEvent 来刷新窗口。
update();
// 提交 my_pressed 信号,调用关联的槽函数。
emit my_pressed();
}
void MyPushButton::mouseReleaseEvent(QMouseEvent *event)
{
mouse_is_down = false;
update();
}
绘图事件 paintEvent
Qt 的 Widget每次在窗口需要刷新时都会调用 paintEvent事件来进行刷新界面。覆盖(override)此函数可以实现窗口的自定义绘图。
void QWidget::paintEvent(QPaintEvent *event)
Qt 网络编程
字符串QString 和字节数组 QByteArray
-
QString 字符串(存放文字)
-
QByteArray 字符数组(存放字节编码)
//将字符串转化成为 Utf8 编码的字节数组
QByteArray QString::toUtf8() const// 将字节数组 转为字符串 QString
QString QString::fromUtf8(const char *str, int size = -1)
// str 是执行字节数组的 缓冲区首地址, size 是内存长度。
// 或
QString QString::fromUtf8(const QByteArray & src);
QTcpSocket
Tcp传输
常用的成员函数
// 构造函数
QTcpSocket(QObject *parent = nullptr);
// 连接到主机
void connectToHost();
// 发送数据包
write()、writeData()
// 接收数据包
read() 、readData()、ReadAll();
//接收到数据产生的信号
readReady()
// 连接成功产生信号
connected()
// 断开连接产生信号
disconnected()
QUdpSocket
Udp传输
常用的成员函数
// 构造函数
QUdpSocket(QObject *parent = nullptr);
// 发送数据包
writeDatagram()
// 接收数据包
readDatagram()、receiveDatagram()
//接收到数据产生的信号
readReady()