【发布时间】:2025-12-01 17:50:01
【问题描述】:
有人可以向我解释为什么在基类插槽中没有调用被覆盖的方法,而是我有一个基本版本的方法:
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*)));
在我需要用变量ptr 替换this 的地方,我得到了正常的结果。
我连接的功能:
bool ThreadsDispatcher::AddThread(IThreadable* pThreadWorker)
{
connect(pThreadWorker, SIGNAL(sigFinished(IThreadable*)), this, SLOT(slotThreadFinished(IThreadable*)));
}
我不直接实例化 ThreadsDispatcher。我创建了 CommandsQueueDispatcher 的非静态对象。
【问题讨论】:
-
看起来很奇怪。尝试手动重新运行 qmake。此外,如果您使用影子构建(IMO 是一个好主意,并且默认情况下由 Qt Creator 建议),请确保您没有意外地在源目录中完成构建。
-
我在 qt creator 和 visual studio 2012 下的两台不同的计算机上检查了这个 - 没有效果。看来如果我用这个,那么我还没有访问虚拟成员的表
-
您能否也显示与插槽进行信号连接的代码?调用哪个函数实现取决于对象的静态类型。
-
是否有可能在对象构造完成之前调用
OnThreadFinished(在CommandsQueueDispatcher构造函数返回之前)?如果是,那么很可能这是您的问题*.com/a/496450/1387438。 -
没有。我检查断点。两个构造函数都返回,然后调用 OnThreadFinished。此外,如果我将调用 OnThreadFinished 从插槽移动到另一个方法(简单的 C++ 方法),我工作得很好。是signal/slot的qt系统……但是为什么……