为什么我不能从基类插槽Qt调用虚函数
Why can not I call virtual function from base class slot Qt
有人可以向我解释为什么在基类插槽中没有调用被覆盖的方法,而是我有一个基本版本的方法:
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();
}
调用后 线程完成 在插槽中,我得到:
Base method, class ThreadsDispatcher
如果我从另一个方法调用方法 OnThreadDone,我会得到正常:
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。我创建了 CommandQueueDispatcher 的非静态对象。
故障排除建议(太长,无法添加注释):
尝试将插槽更改为如下所示:
void ThreadsDispatcher::OnThreadFinished(IThreadable *pWorker)
{
qDebug << "Base method, class" << this->metaObject()->className();
}
派生类也是如此。查看输出内容。
如果输出是"正确的",因为调用的虚拟方法与类名一致,那么我怀疑你确实以某种方式有一个基类对象,而不是派生的类对象。
如果存在输出不匹配,基类虚拟方法执行打印但报告派生的类名,那么我会寻找任何有趣的编译器标志,并尝试使用新项目创建一个 SSCCE,然后也许在这里再次询问和/或向 Qt 提交错误报告。
在Qt文档中开始阅读此内容的链接。
故障排除的第二个步骤:通过将此方法在基类中排除来将基类更改为抽象:
virtual void OnThreadFinished(IThreadable *pWorker) = 0;
。然后删除方法定义。现在编译器应该告诉你在哪里尝试创建基类的实例。
还有一个建议:Qt构建基础知识,例如在此答案中列出。特别是,请确保 QObject 子类是在 .h 文件中定义的,这些文件列在 .pro 文件 HEADERS 列表中。
相关文章:
- 如何从其他类n个Qt C++调用QTimer?
- 在从Qt调用的Python脚本中导入OpenCV崩溃
- Qt 调用具有 1 个以上参数的 java 方法
- QDialog 继承类的 Qt 调用成员函数
- 从QT调用JavaScript函数,并未显示输出
- 如何从C++/Qt调用QtActivity中的非静态Java方法
- Qt:调用终端+脚本的QProcess
- 从Qt C++调用Fortran函数
- 从Qt调用C++函数(插槽不起作用)
- 从Qt C++调用Java函数
- 扩展 QWidget 上的 Qt/C++ 调用函数
- Qt 调用在发布模式下失败
- QT/c++调用父级方法的最佳方法
- 为什么我不能从基类插槽Qt调用虚函数
- Qt:调用QEventLoop::exec后死锁
- QT调用函数在不同的源代码
- Qt调用外部Python脚本
- Qt调用具有自定义QObject类型的qml函数
- Qt 5.2调用QTableWidget::update不会导致QTableWidget:paintEvent
- 只有当两个信号都发出时才调用Qt -调用槽