字符串处理: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)为这个类生成额外的代码。
- 定义信号
c
signals:
void dataReady(const QString &data); // 只需要声明,不要写实现
- 定义槽
c
public slots:
void processData(const QString &data) {
qDebug() << "接收到数据:" << data;
}
- 连接 (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"