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

Accesing Base Class Signal using derived Class Object Qt

本文关键字:Qt 访问 基类 信号 对象 派生      更新时间:2023-10-16

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

基类

/

/在其构造函数中发出信号 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) 中使用连接语句并调用 SLOT.It 没有给出编译错误,但插槽没有被调用。

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    IPCReceiver *receiver = new IPCReceiver;
    connect(receiver, SIGNAL(temp()), this, SLOT(debug()));
}

提前谢谢。

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

通常不应该从派生自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 ,你可以把它作为一个成员变量;然后编译器生成的默认析构函数就足够了。