QT函数重载

本文深入探讨了Qt中信号与槽机制的工作原理,包括函数重载、信号连接、参数匹配等关键概念。同时,文章还讲解了如何解决乱码问题及字符串转换技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里函数发生重载

signals:
	void hungery();
	void hungery(QString);

public slots:
	void treat();
	void treat(QString);

通过指针可以明确指向有参的重载函数,需要声明作用域,因为teacherSignal,studentSignal不是全局的

	void(Teacher::*teacherSignal)(QString) = &Teacher::hungery;
	void(Student::*studentSignal)(QString) = &Student::treat;
	connect(tea, teacherSignal, stu, studentSignal);

有关打印的几个问题:
1 乱码
QString::fromLocal8Bit(QString)
2 去引号
XXX.toUtf8().data()
将Qstring->char*:先转成QByteArray(.toUtf8())再转成char*()

信号与槽
1 信号可以连接信号
2 一个信号可以连接多个槽函数
3 多个信号可以连接同一个槽函数
4 信号和槽函数的参数类型必须一致
5 信号和槽的参数个数可以不一致

### Qt TableView 数据模型重载函数实现 #### QStandardItemModel 的基本结构 `QStandardItemModel` 是 `QAbstractItemModel` 类的一个具体实现,用于存储标准项目的数据。该类可以方便地创建和操作表格或树形结构的数据[^1]。 ```cpp // 创建具有指定行数和列数的标准项模型 QStandardItemModel::QStandardItemModel(int rows, int columns, QObject *parent = nullptr); ``` #### 重写数据访问方法 为了定制化显示逻辑或行为,通常会继承 `QAbstractItemModel` 并重新实现其虚函数。对于 `QTableView` 来说,最常用的是覆盖以下几个关键的方法: - **data()**: 返回索引对应位置上的单元格内容。 - **setData()**: 设置特定索引处的新值并通知视图更新。 - **rowCount() 和 columnCount()**: 定义表中有多少行和列。 - **headerData()**: 提供水平或垂直方向上标题栏的信息。 以下是这些方法的具体应用实例: ```cpp class CustomTableModel : public QAbstractItemModel { Q_OBJECT public: explicit CustomTableModel(QObject* parent = nullptr); QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex &child) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; }; ``` #### 实际案例展示 假设有一个简单的学生成绩单作为例子,这里展示了如何构建自定义的 `CustomTableModel` 及其实现细节: ```cpp #include <QVariant> #include <QStringList> class StudentGradeModel : public CustomTableModel { private: QStringList m_headers; // 存储表头信息 QList<QPair<QString, double>> m_data; // 记录学生姓名及其成绩 public: StudentGradeModel(QObject* parent = nullptr): CustomTableModel(parent), m_headers({"Name", "Score"}) {} protected: int rowCount(const QModelIndex&) const override { return m_data.size(); } int columnCount(const QModelIndex&) const override { return m_headers.size(); } QVariant data(const QModelIndex &idx, int role) const override { if (!idx.isValid()) return QVariant(); if (role == Qt::DisplayRole || role == Qt::EditRole){ auto pair = m_data.at(idx.row()); switch (idx.column()){ case 0: return pair.first; case 1: return QString("%L1").arg(pair.second); default: break; } } else if(role == Qt::TextAlignmentRole && idx.column()==1){ return static_cast<int>(Qt::AlignRight | Qt::AlignVCenter); } return QVariant(); } bool setData(const QModelIndex &idx, const QVariant &value, int role) override { if(data(idx, role).canConvert<double>() && role==Qt::EditRole){ auto& pair=m_data[idx.row()]; if(idx.column()==1){ pair.second=value.toDouble(); emit dataChanged(idx,idx,{}); return true; } } return false; } QVariant headerData(int section, Qt::Orientation orient, int role)const override{ if(orient==Qt::Horizontal&&role==Qt::DisplayRole) return m_headers[section]; return {}; } }; ``` 此代码片段说明了如何利用上述提到的关键成员函数来自定义一个适用于 `QTableView` 控件的数据源对象,并实现了对学生分数列表的基本编辑功能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值