6

有人可以向我解释为什么在基类插槽中没有调用覆盖的方法,而是我有一个基本版本的方法:

class ThreadsDispatcher : public QObject
{
   Q_OBJECT
   public:
      explicit ThreadsDispatcher(QObject *parent = 0);
      virtual ~ThreadsDispatcher();
      virtual void OnThreadFinished(IThreadable *pWorker);

   public slots:
      void slotThreadFinished(IThreadable *pWorker);
};

void ThreadsDispatcher::slotThreadFinished(IThreadable *pWorker)
{
   OnThreadFinished(pWorker);
}

void ThreadsDispatcher::OnThreadFinished(IThreadable *pWorker)
{
   qDebug << "Base method, class" << this->metaObject()->className();
}

一个子类:

class CommandsQueueDispatcher : public ThreadsDispatcher
{
    Q_OBJECT
    public:
       explicit CommandsQueueDispatcher(CommandFactory* baseFactory, QObject *parent = 0);
       ~CommandsQueueDispatcher();
       void OnThreadFinished(IThreadable *pWorker);
};

 void CommandsQueueDispatcher::OnThreadFinished(IThreadable *pWorker)
 {
    qDebug << "Subclass method, class" << this->metaObject()->className();
 }

在插槽中调用 OnThreadFinished 后,我得到:

Base method, class ThreadsDispatcher

如果我从另一个方法调用方法 OnThreadFinished ,我会正常:

Subclass method, class CommandsQueueDispatcher

我试图连接基类和子类,但没有任何变化:

connect(pThreadWorker, SIGNAL(sigFinished(IThreadable*)), this, SLOT(slotThreadFinished(IThreadable*)));

但是如果我从另一个类连接,即既不是子类也不是基类:

    connect(pThreadWorker, SIGNAL(sigFinished(IThreadable*)), pWorker, SLOT(slotThreadFinished(IThreadable*)));

我需要this用变量替换的地方ptr,我得到一个正常的结果。

我连接的功能:

bool ThreadsDispatcher::AddThread(IThreadable* pThreadWorker)
{
   connect(pThreadWorker, SIGNAL(sigFinished(IThreadable*)), this, SLOT(slotThreadFinished(IThreadable*)));
}

我不直接实例化 ThreadsDispatcher。我创建了 CommandsQueueDispatcher 的非静态对象。

4

1 回答 1

0

故障排除建议(评论太长):

尝试将插槽更改为如下所示:

void ThreadsDispatcher::OnThreadFinished(IThreadable *pWorker)
{
   qDebug << "Base method, class" << this->metaObject()->className();
}

派生类也是如此。看看输出什么。

如果在调用虚拟方法与类名一致的意义上输出是“正确的”,那么我怀疑你确实有一个基类对象,而不是派生类对象。

如果输出不匹配,基类虚拟方法执行打印但报告派生类名称,那么我会寻找任何有趣的编译器标志,并尝试使用新项目创建一个SSCCE,然后可能在这里再次询问和/或归档向 Qt 报告错误。

在 Qt 文档中开始阅读此内容的链接。


故障排除的第二步:通过使此方法在基类中抽象,将基类更改为抽象:

  virtual void OnThreadFinished(IThreadable *pWorker) = 0;

...然后删除方法定义。现在编译器应该告诉您尝试在哪里创建基类的实例。


还有一个建议:Qt build basics,例如在这个答案中列出。特别是,确保 QObject 子类在 .h 文件中定义,这些文件在 .pro 文件 HEADERS 列表中列出。

于 2013-09-10T05:09:42.920 回答