我遇到连接问题。我的问题是: 我有一个名为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调用中。
答案 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);