《Qt应用开发》笔记p4

元对象编译器 MOC(Meta Object Complile)

Qt 的 .cpp程序和.h 程序可能或通过 MOC进行二次编译生成标准的C++程序,然后再有Makefile编程成可执行程序。

Qt 的信号和槽机制不是C++标准语法,他是基于Qt的元对象系统进行二次编译后才能够通过 编译器编译和使用。

Qt 元对象编译器的基础条件

  1. 类一定是QObject类派生出来的子类
  2. 类内必须包含 Q_OBJECT宏(通常写在类定义的第一行)
  3. 要安装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()
相关推荐
chicheese2 分钟前
Linux 面试速查表:从初级到高级,附高频场景答题模板
linux·运维
qq_25183645720 分钟前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
Linux-lucky30 分钟前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
郑州光合科技余经理1 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
vortex51 小时前
常用终端模拟器全面对比:Kitty、WezTerm、Ghostty 与 Konsole
linux
知识分享小能手1 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
qq_199886872 小时前
第8板块·第2节:统一内存的高级特性与性能调优
c++·人工智能·gpu算力·cuda
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
一 乐2 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
阿里嘎多学长2 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管