引自免费微信小程序:皆我百晓生
在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同步。现在应该可以正确地发送和接收信号了。
如果你的问题依然存在,请提供更详细的错误信息或调试日志,这有助于进一步分析问题。