jasonhu2 2024-04-22 11:42 采纳率: 0%
浏览 9
已结题

qt信号与槽,跨页面问题

qt信号与槽,跨页面问题
子类
PAGE.h
class PAGE: public QObject
{
Q_OBJECT
signals:
void sig_CreateDevice(QString, long, long, bool, bool);
};
PAGE.cpp
void PAGE::OnClick()
{
emit sig_CreateDevice("127.0.0.1",9901, 9902, false, false);
}

主界面
main.h
class main: public QObject
{
Q_OBJECT

public slots:
void slot_CCC(QString strIP, long nMngrPort, long nDataPort, bool bSign, bool bZlib);
};

main.cpp
int main(int argc, char argv[])
{
PAGE
Page = new PAGE;
connect(Page, SIGNAL(sig_CreateDevice(QString, long, long, bool, bool)), this, SLOT(slot_CCC(QString, long, long, bool, bool)));
Page ->show();
}

以上代码编译可通过
当执行PAGE类OnClick事件时,运行sig_CreateDevice时会报错
报错如下图

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-22 11:42
    关注

    引自免费微信小程序:皆我百晓生

    在Qt中,遇到这种类型的错误通常是因为连接信号和槽时参数类型不匹配,或者是对象生命周期管理不当导致的。从提供的信息来看,问题可能出在信号和槽的参数类型上,或者是PAGE对象的生命周期管理。

    首先,让我们检查一下信号和槽的参数类型是否一致。在头文件中定义的信号和槽的参数列表应完全相同。下面是修复后的代码示例:

    PAGE.h

    class PAGE : public QObject {
        Q_OBJECT
    public:
        explicit PAGE(QObject *parent = nullptr);
    signals:
        void sig_CreateDevice(const QString &strIP, quint16 nMngrPort, quint16 nDataPort, bool bSign, bool bZlib);
    };
    

    main.h

    public slots:
        void slot_CCC(const QString &strIP, quint16 nMngrPort, quint16 nDataPort, bool bSign, bool bZlib);
    

    这里将long类型更改为quint16(无符号短整型),这是Qt中推荐使用的网络端口类型,以确保类型一致性。同时,为了安全起见,我们使用了引用传递(const QString &)而不是值传递(QString)。

    接下来,确保PAGE对象的生命周期足够长,以便在槽函数被调用时仍然存在。通常,将PAGE对象作为成员变量存储在主窗口类中是个好做法,这样可以确保它在主窗口关闭之前不会被销毁。以下是主窗口类的一个简化版本:

    main.h

    class MainWindow : public QMainWindow {
        Q_OBJECT
    public:
        explicit MainWindow(QWidget *parent = nullptr);
    private:
        PAGE m_Page;
    private slots:
        void slot_CCC(const QString &strIP, quint16 nMngrPort, quint16 nDataPort, bool bSign, bool bZlib);
    };
    

    main.cpp

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        // 设置窗口布局和其他初始化操作...
    
        connect(&m_Page, &PAGE::sig_CreateDevice, this, &MainWindow::slot_CCC);
    }
    
    void MainWindow::slot_CCC(const QString &strIP, quint16 nMngrPort, quint16 nDataPort, bool bSign, bool bZlib) {
        // 处理信号的逻辑...
    }
    

    通过这种方式,PAGE对象成为MainWindow的私有成员,其生命周期将与MainWindow同步。现在应该可以正确地发送和接收信号了。

    如果你的问题依然存在,请提供更详细的错误信息或调试日志,这有助于进一步分析问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月22日
  • 修改了问题 4月22日
  • 创建了问题 4月22日