使用派生类对象Qt访问基类信号

时间:2016-06-01 05:24:31

标签: c++ qt signals

嗨,我是Qt和C ++的新手。我有一个要求,我必须使用派生类对象访问Base类的信号。是否可能,如果是,那么如何?我尝试使用一个简单的应用程序来实现它,但它无法正常工作。

//基类

//在其构造函数

中发出信号temp()
class IPCBase : public QWidget
{
    Q_OBJECT

public:
    explicit IPCBase(QWidget *parent = 0);
    ~IPCBase();

signals:
    void temp();

private:
    Ui::IPCBase *ui;
};

// CPP

IPCBase::IPCBase(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::IPCBase)
{
    ui->setupUi(this);
    qDebug()<<"coming to base cpp";
    emit temp();
}

我创建了一个名为IPCReceiver的派生类,并使用IPCReceiver(派生类)的对象我试图在另一个类(Form)中使用connect语句并调用SLOT。它没有给出编译错误但是SLOT是没有被召唤。

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);

    IPCReceiver *receiver = new IPCReceiver;

    connect(receiver, SIGNAL(temp()), this, SLOT(debug()));
}

提前致谢。

2 个答案:

答案 0 :(得分:3)

您的信号temp()在类的构造函数中发出。这就是你的连接无法使用的原因。在你的逻辑中:首先在构造函数中发出信号,然后创建连接。在创建连接后,您必须发出信号。

答案 1 :(得分:0)

你通常不应该从任何来自QObject的类的构造函数发出任何信号,因为它使得类更难使用。在构造函数完成后,您需要从事件循环中发出信号。至少有两个成语表达:

使用与QObject::destroyed

的连接
IPCBase::IPCBase(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::IPCBase)
{
    ui->setupUi(this);
    QObject src;
    connect(&src, &QObject::destroyed, this, &IPCBase::temp, Qt::QueuedConnection);
}

src对象仅用作通用信号的来源。

使用QMetaObject::invokeMethod

IPCBase::IPCBase(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::IPCBase)
{
    ui->setupUi(this);
    QMetaObject::invokeMethod(this, "temp", Qt::QueuedConnection);
}

顺便说一句,你不需要动态分配Ui,你可以把它变成一个成员变量;那么编译器生成的默认析构函数就足够了。