有人可以向我解释为什么在基类槽中没有调用重写的方法,而是我有一个基本版本的方法:
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();
}
Run Code Online (Sandbox Code Playgroud)
子类:
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();
}
Run Code Online (Sandbox Code Playgroud)
在插槽中调用OnThreadFinished后,我得到:
Base method, class ThreadsDispatcher
Run Code Online (Sandbox Code Playgroud)
如果我从另一个方法调用方法OnThreadFinished,我会正常:
Subclass method, class CommandsQueueDispatcher
Run Code Online (Sandbox Code Playgroud)
我试图在基类和子类中连接,但没有变化:
connect(pThreadWorker, SIGNAL(sigFinished(IThreadable*)), this, SLOT(slotThreadFinished(IThreadable*)));
Run Code Online (Sandbox Code Playgroud)
但是,如果我从另一个类连接,即既不是子类,也不是基类:
connect(pThreadWorker, SIGNAL(sigFinished(IThreadable*)), pWorker, SLOT(slotThreadFinished(IThreadable*)));
Run Code Online (Sandbox Code Playgroud)
我需要this用变量替换ptr,我得到一个正常的结果.
我连接的功能:
bool ThreadsDispatcher::AddThread(IThreadable* pThreadWorker)
{
connect(pThreadWorker, SIGNAL(sigFinished(IThreadable*)), this, SLOT(slotThreadFinished(IThreadable*)));
}
Run Code Online (Sandbox Code Playgroud)
我没有直接实例化ThreadsDispatcher.我创建CommandsQueueDispatcher的非静态对象.
故障排除建议(评论太长):
尝试将插槽更改为如下所示:
void ThreadsDispatcher::OnThreadFinished(IThreadable *pWorker)
{
qDebug << "Base method, class" << this->metaObject()->className();
}
Run Code Online (Sandbox Code Playgroud)
派生类也是如此。看看输出了什么。
如果输出是“正确的”,即所谓的虚拟方法与类名一致,那么我怀疑您确实有一个基类对象,而不是派生类对象。
如果存在输出不匹配,基类虚拟方法会进行打印,但会报告派生类名称,那么我会寻找任何有趣的编译器标志,并尝试使用新项目创建 SSCCE ,然后可能会在此处再次询问和/或提交一个文件向 Qt 报告错误。
用于开始阅读 Qt 文档中相关内容的链接。
故障排除的第二步:通过在基类中将此方法设为抽象,将基类更改为抽象:
virtual void OnThreadFinished(IThreadable *pWorker) = 0;
Run Code Online (Sandbox Code Playgroud)
...然后删除方法定义。现在编译器应该告诉您在哪里尝试创建基类的实例。
还有一个建议:Qt 构建基础知识,例如在此答案中列出的。特别是,确保 QObject 子类在 .h 文件中定义,这些子类在 .pro 文件 HEADERS 列表中列出。
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |