Qt在调用connect时给出了一个错误

时间:2012-02-29 01:47:51

标签: c++ debugging qt

我遇到连接问题。我的问题是: 我有一个名为eventos(events)的类,它将管理所有对象事件(按钮,列表等...)但是当我调用一个事件时,它会给我一个内存读取错误。 这是我的代码:

我的主要课程:

#include "ratagbc.h"
#include "eventos.h"

RataGBC::RataGBC(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    eventos e;
    connect(ui.runBtn,SIGNAL(clicked()),this,SLOT(e.on_runBtn_clicked()));
    ui.setupUi(this);
}

RataGBC::~RataGBC()
{

}

eventos.h:

#include QDialog.h
#include "ui_ratagbc.h"

class eventos : public QDialog, public Ui::RataGBCClass { 
    Q_OBJECT    
public:     
        eventos(void);
    ~eventos(void);

    public slots:       void on_runBtn_clicked(); };

eventos.cpp:

#include "eventos.h"
#include <QMessageBox>


eventos::eventos(void)
{
}


eventos::~eventos(void)
{
}

void eventos::on_runBtn_clicked()
{
    QMessageBox qb;
    qb.setText("Rata");
    qb.exec();
}

错误是:

  

RataGBC.exe中0x776a15de处的未处理异常:0xC0000005:访问冲突读取位置0x00000964。

调试我意识到(或猜到了?)错误似乎是在SINGAL调用中。

3 个答案:

答案 0 :(得分:2)

对象eventos e的范围和生命周期受构造函数体的限制。你应该把它作为RataGBC的成员;或者从QObject继承它(我没有看到eventos.h,但我相信你已经继承了它,只要你使用信号槽机制),并在它作为{{1的孩子'的动态创建它像这样

RataGBC

或者不要让它成为子项,但只需在eventos * e = new eventos(); e->setParent(this);

的析构函数中删除它

答案 1 :(得分:1)

你的连接方法是......

connect(ui.runBtn,SIGNAL(clicked()),this,SLOT(e.on_runBtn_clicked()));

这意味着无论何时发出按钮点击信号,那么对于该信号,qt将搜索RataGBC类中没有任何这样的时隙的时隙。为此,要避免你应该用eventos对象替换当前的接收者对象,如下所示..

connect(ui.runBtn,SIGNAL(clicked()),e,SLOT(e.on_runBtn_clicked()));

这对你有用..

答案 2 :(得分:0)

尝试以下代码,您的事件,对象的范围仅限于构造函数,其次您使用此作为插槽的目标对象,但您希望e成为目标。您还应该创建一个类成员变量并在析构函数中删除它。

eventos *e = new eventos();
connect(ui.runBtn,SIGNAL(clicked()),e,SLOT(on_runBtn_clicked()));
ui.setupUi(this);