我正在尝试在某些遗留代码中使用新的连接语法,但遇到了架构问题。所以让我们假设我有一个看起来像这样的 BaseReader 类:
class BaseReader : public QObject
{
Q_OBJECT
public:
BaseReader();
public slots:
virtual void read(const fstream& myStream);
}
然后假设我有一些这样的儿童课程
class Reader1 : public BaseReader
{
Q_OBJECT
public:
BaseReader();
public slots:
virtual void read(const fstream& myStream);
}
一些读取工作在基类中完成,一些在子类中完成。我有大约 4 个在运行时切换的类。我有一个连接阅读器函数,看起来像这样:
void connectReaders(BaseReader* currentReader)
{
connect(this, SIGNAL(mustRead(const fstream&)), currentReader, SLOT(read(const fstream&)));
}
现在我的理解是,如果我使用新语法,我将连接到基本成员函数,而不是重载版本。这是对的吗?有没有办法在不修改架构的情况下使用新语法连接这些信号? 我的示例非常简化,修改该代码需要几个月的时间(包括测试(。它以旧方式工作,但我想利用新语法。有什么想法吗?
我已经查看了这些线程,但它们似乎没有提供解决此问题的方法:
这是相反的方式:使用具有多重继承的Qt信号和插槽
我已经阅读了这篇文章,但我不确定我是否理解过载部分适用:https://wiki.qt.io/New_Signal_Slot_Syntax
我有qt5.4.1,Visual Studio 2013。
将新的"连接"语法与虚拟插槽和基类对象指针一起使用时没有问题。您正在指定对象实例(例如 currentReader
(,并且要调用的特定方法将使用此对象的虚拟方法表进行解析。
免责声明:我不熟悉Qt。然而,这里的问题似乎是一个C++的问题。
当使用指向基类中虚函数的成员指针时,在指向派生类的指针/引用上,将调用派生类中的重写(如果存在(。
class Base
{
public:
virtual void f()
{
std::cout << "Basen";
}
};
class Derived : public Base
{
public:
virtual void f()
{
std::cout << "Derivedn";
}
};
int main()
{
void (Base::* pmf)() = &Base::f;
Derived d;
(d.*pmf)();
}
将打印"派生",而不是"基础";
如果Qt信号使用派生对象调用成员函数指针,则将因此调用函数覆盖。