未定义的函数发送参考

时间:2013-11-06 13:07:49

标签: c++ qt

我是C ++ / Qt编程的初学者。我已经创建了这个简单的对话框来检查QLineEdit,如果输入的文本是“bob”应该启用OK按钮。 我无法成功编译,它给了我:

dialog.cpp|31|undefined reference to `Dialogmio::send()'

我做错了什么?

这是dialog.h:

//dialog.h
#ifndef DIALOG_H_INCLUDED
#define DIALOG_H_INCLUDED
#include <QDialog>

class QPushButton;
class QLineEdit;

class Dialogmio : public QWidget


{


public:
Dialogmio(QWidget *parent =0);

signals:
void send ();

public slots:
void recip(QString &text);


private:

QLineEdit *linedit;
QPushButton *buttonOK;


};

#endif

这是dialog.cpp:

//dialog.cpp
#include <QtGui>

#include "dialog.h"

Dialogmio::Dialogmio(QWidget *parent)
: QWidget(parent)
{

linedit = new QLineEdit();
buttonOK = new QPushButton("OK");
buttonOK->setEnabled(FALSE);


connect( linedit, SIGNAL( textChanged(const QString &) ), this, SLOT( recip(const QString &) ));
connect (this,SIGNAL( send()), this, SLOT( buttonOK->setEnabled(true)) );

QHBoxLayout *layout = new QHBoxLayout();
layout->addWidget(linedit);
layout->addWidget(buttonOK);
setLayout(layout);


}

void Dialogmio::recip(QString &text)
{
QString a = linedit->text();
if (a == "bob"){

emit send();   //here it gives me the error

}
}

这是main.cpp:

#include <QApplication>
#include "dialog.h"


int main(int argc, char* argv[])
{
QApplication app(argc, argv);

Dialogmio *dialog = new Dialogmio;
dialog->show();

return app.exec();
}

我按照建议插入了Q_OBJECT宏,现在我在第7行又出现了一个错误:

dialog.cpp|7|undefined reference to `vtable for Dialogmio'|

1 个答案:

答案 0 :(得分:3)

首先包含QDialog的Qt文件,然后继续从QWidget继承。虽然从QWidget继承不是问题,但是你打算从QDialog(?)继承,在这种情况下你应该这样定义你的类: -

class Dialogmio : public QDialog
{
    Q_OBJECT

    public:
        Dialog(QWidget* parent);

    private slots:
        void aSlotFunction();
}

信号和插槽机制是Qt独有的C ++扩展,为了让类使用它,该类必须包含Q_OBJECT宏,它添加了所有必要的功能。在构建阶段,Qt解析标头并创建扩展所需的代码,包括运行时类型信息,动态属性系统以及信号和插槽当然。

正如您所说,您正在使用代码块作为IDE,如果它在构建之前没有自动运行qmake,那么每当您向类添加任何信号或槽以便为moc(元)时,您都需要这样做-object-compiler)看到它们。

另一件事是连接信号和插槽的调用是错误的: -

connect (this,SIGNAL( send()), this, SLOT( buttonOK->setEnabled(true)) );

SLOT宏中的参数采用插槽功能,因此您需要创建一个插槽并将其连接到发送信号: -

connect(this, SIGNAL(send()), this, SLOT(aSlotFunction());

在aSlotFunction中,您可以调用为该按钮启用的设置: -

void Dialogmio::aSlotFunction()
{
    buttonOK->setEnabled(true);
}

如果您使用的是Qt 5,则处理连接的语法更简单: -

connect(this, &Dialogmio::send, this, &Dialogmio::aSlotFunction);

由于此语法接受将要调用的函数的指针,因此实际上不必将它们声明为工作槽。此外,您不提供参数,因此如果它们发生更改,您也不必更新连接调用。