Qt C++中如何跨类访问类属性?访问时返回空串与0值
解决Qt跨类访问属性为空/0的问题
问题根源
核心问题是:你在secwin::on_clicked()里新建了一个全新的Dialog实例dlg,这个对象和之前设置prodname、id的那个Dialog完全不是同一个,所以它的属性都是默认值(空字符串、0)。另外代码里还有几处语法错误,也会导致逻辑失效:
- 大小写不匹配:类里定义的是
prodname,赋值时写的是Prodname - 函数名错误:
toint()应该是toInt(),settext()应该是setText() - 括号不匹配:
QString::number(dlg.id)后面少了闭合括号
正确实现方案
方案1:传递已存在的Dialog实例指针/引用
这是最直接的方式,确保你访问的是已经设置过属性的那个Dialog对象:
- 修改
secwin类,添加成员变量存储Dialog的指针:
// secwin.h #include "dialog.h" class secwin { private: Dialog* m_dialog; // 保存Dialog实例的指针 public: void setDialog(Dialog* dialog) { m_dialog = dialog; } // 提供设置方法 // ... 其他成员 };
- 在创建
secwin的地方,把已有的Dialog实例传进去:
// 比如在Dialog类里打开secwin时 void Dialog::openSecWin() { secwin* win = new secwin; win->setDialog(this); // 把当前Dialog实例的指针传进去 win->show(); }
- 在
secwin::on_clicked()里直接使用这个指针访问属性:
void secwin::on_clicked(){ if(m_dialog) { // 先判断指针是否有效 ui->qty->setText(m_dialog->prodname); ui->id->setText(QString::number(m_dialog->id)); } }
方案2:使用Qt信号槽机制(更符合Qt设计理念)
如果两个类之间不想过度耦合,用信号槽传递数据更合适:
- 在
Dialog类里定义信号,当属性更新时发出:
// dialog.h class Dialog : public QDialog { Q_OBJECT // 必须添加这个宏 private: QString prodname; qint32 id; signals: void dataUpdated(const QString& name, qint32 id); // 定义信号 public slots: void on_clicked(); };
- 在
Dialog::on_clicked()里更新属性并发出信号:
void Dialog::on_clicked(){ prodname = ui->qty_label->text(); // 修正大小写 id = ui->id_label->text().toInt(); // 修正函数名 emit dataUpdated(prodname, id); // 发出信号 }
- 在
secwin类里定义槽函数,接收数据:
// secwin.h class secwin : public QWidget { Q_OBJECT public slots: void updateData(const QString& name, qint32 id); // 定义槽 };
// secwin.cpp void secwin::updateData(const QString& name, qint32 id){ ui->qty->setText(name); ui->id->setText(QString::number(id)); }
- 在两个类实例都存在时,连接信号和槽:
// 比如在创建secwin和Dialog的地方 Dialog* dlg = new Dialog; secwin* win = new secwin; connect(dlg, &Dialog::dataUpdated, win, &secwin::updateData);
额外注意事项
- 确保你的类都添加了
Q_OBJECT宏,否则信号槽机制无法工作 - 尽量避免直接暴露公共属性,可以改成私有属性并提供
getter方法,更符合封装原则:
class Dialog : public QDialog { Q_OBJECT private: QString m_prodname; qint32 m_id; public: QString getProdName() const { return m_prodname; } qint32 getId() const { return m_id; } // ... };
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

