【问题标题】:Accesing Base Class Signal using derived Class Object Qt使用派生类对象 Qt 访问基类信号
【发布时间】:2016-06-01 05:24:30
【问题描述】:

您好,我是 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。它没有给出编译错误,但 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()));
}

提前致谢。

【问题讨论】:

  • IPCReceiver 何时发出temp 信号?

标签: c++ qt signals


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2014-03-13
      • 2020-08-06
      相关资源
      最近更新 更多