2.Qt-基础核心以及信号与槽

字符串处理:QString

常用功能:格式化字符串、数字转换、拼接、分割。

c 复制代码
QString name = "Qt";
int version = 6;

// 1. 格式化输出
QString status = QString("正在学习 %1 的第 %2 个版本").arg(name).arg(version);
// 结果: "正在学习 Qt 的第 6 个版本"

// 2. 数字转换
int num = status.split(" ").last().toInt(); // 提取最后一个词(last)并转为 int(Toint)
容器类:QVector, QList, QMap

QList: Qt 中最通用的列表容器。

QMap: 键值对映射(基于红黑树)。

QHash: 哈希表(查找速度比 QMap 快,但无序)。

c 复制代码
QList<QString> list;
list << "Apple" << "Banana"; // 支持流式操作符插入
list.append("Orange");

QMap<QString, int> scores;
//两种赋值方法
scores["Alice"] = 100;
scores.insert("Bob", 90);
调试:qDebug()

它会自动处理空格、自动换行,并且能直接打印 Qt 的对象。

c 复制代码
#include <QDebug>
//流式输出
qDebug() << "用户列表:" << list; // 直接打印整个列表,无需写循环
// 输出: 用户列表: ("Apple", "Banana", "Orange")
信号与槽 (Signals & Slots)
html 复制代码
信号 (Signal): 当对象内部状态发生改变,或者发生了某件事(比如按钮被点击、数据下载完成)时,它会发出(emit)一个信号。
槽 (Slot): 这是一个普通的成员函数。当它连接的信号被发射时,这个槽函数会被自动调用,用来处理响应逻辑。
连接 (Connect): 将信号和槽绑定在一起的桥梁。

任何使用信号与槽的类,必须在类声明的私有部分(private)添加 Q_OBJECT 宏。这会告诉 Qt 的元对象编译器(MOC)为这个类生成额外的代码。

  1. 定义信号
c 复制代码
signals:
    void dataReady(const QString &data); // 只需要声明,不要写实现
  1. 定义槽
c 复制代码
public slots:
    void processData(const QString &data) {
        qDebug() << "接收到数据:" << data;
    }
  1. 连接 (connect)
c 复制代码
QObject::connect(senderObj, &SenderClass::signalName, 
                 receiverObj, &ReceiverClass::slotName);
示例

创建时候选Qt Console Application (Qt 控制台应用程序)。

c 复制代码
#include <QCoreApplication>
#include <QObject>
#include <QDebug>
#include <QString>

// --- 1. 定义发送者类:指挥官 ---
class Commander : public QObject {
    Q_OBJECT // 必须加这个宏,启用信号槽机制

    public:
        Commander() {}

        // 模拟下达命令的函数
        void orderAttack(const QString &target) {
            qDebug() << "指挥官: 收到请回复" << target;
            // 发射信号,面向对象编程要我们类内或者公共函数内触发
            emit attackSignal(target);
        }

    signals:
        // 信号声明:不需要写函数体,只负责传参
        void attackSignal(const QString &target);
};

// --- 2. 定义接收者类:士兵 ---
class Soldier : public QObject {
    Q_OBJECT

    public:
        //给私有属性赋值
        Soldier(QString name) : m_name(name) {}

    public slots:
        // 槽函数:接收信号后的处理逻辑
        void onAttackOrdered(const QString &target) {
            qDebug() << "特种兵" << m_name << "over!" << target;
        }

    private:
        QString m_name;
};

// --- 3. 主程序 ---
int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 实例化对象
    Commander boss;
    Soldier s1("瑞恩");
    Soldier s2("阿甘");

    // 建立连接:长官-> 士兵
    QObject::connect(&boss, &Commander::attackSignal,
                     &s1, &Soldier::onAttackOrdered);

    QObject::connect(&boss, &Commander::attackSignal,
                     &s2, &Soldier::onAttackOrdered);

    qDebug() << "--- 战斗准备就绪 ---";

    // 触发事件
    boss.orderAttack("yesir");


    // return 0; 结束。
    // 在真实控制台程序中通常使用 return a.exec(); 进入事件循环。
    return 0;
}

// 单文件示例(类写在cpp里),必须加
// 它的作用是包含 Qt 自动生成的元对象代码。
// 如果你把类分拆成 .h 和 .cpp 文件,就不需要这一行。
#include "main.moc"
相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript