You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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对象:

  1. 修改secwin类,添加成员变量存储Dialog的指针:
// secwin.h
#include "dialog.h"
class secwin {
private:
    Dialog* m_dialog; // 保存Dialog实例的指针
public:
    void setDialog(Dialog* dialog) { m_dialog = dialog; } // 提供设置方法
    // ... 其他成员
};
  1. 在创建secwin的地方,把已有的Dialog实例传进去:
// 比如在Dialog类里打开secwin时
void Dialog::openSecWin() {
    secwin* win = new secwin;
    win->setDialog(this); // 把当前Dialog实例的指针传进去
    win->show();
}
  1. 在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设计理念)

如果两个类之间不想过度耦合,用信号槽传递数据更合适:

  1. 在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();
};
  1. 在Dialog::on_clicked()里更新属性并发出信号:
void Dialog::on_clicked(){
    prodname = ui->qty_label->text(); // 修正大小写
    id = ui->id_label->text().toInt(); // 修正函数名
    emit dataUpdated(prodname, id); // 发出信号
}
  1. 在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));
}
  1. 在两个类实例都存在时,连接信号和槽:
// 比如在创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:31:03