使用带有继承的 Qt5 新连接语法
Using Qt5 new connect syntax with inheritance
我正尝试在一些遗留代码中使用新的连接语法,但遇到了体系结构问题。所以让我们假设我有一个 BaseReader class 看起来像这样:
class BaseReader : public QObject
{
Q_OBJECT
public:
BaseReader();
public slots:
virtual void read(const fstream& myStream);
}
那么假设我有一些 children class这样的
class Reader1 : public BaseReader
{
Q_OBJECT
public:
BaseReader();
public slots:
virtual void read(const fstream& myStream);
}
一些读取工作在 class 基地完成,一些在 child class 完成。我有大约 4 个 classes 在运行时切换。我有一个 connectReaders 函数,如下所示:
void connectReaders(BaseReader* currentReader)
{
connect(this, SIGNAL(mustRead(const fstream&)), currentReader, SLOT(read(const fstream&)));
}
现在我的理解是,如果我使用新语法,我将连接到基本成员函数,而不是重载版本。那是对的吗 ?有没有办法在不修改架构的情况下使用新语法连接这些信号?我的示例非常简单,修改该代码需要几个月的时间(包括测试)。它以旧方式工作,但我想利用新语法。有什么想法吗?
我查看了这些线程,但它们似乎没有提供解决此问题的方法:
这是反过来的:
Using Qt signals and slots with multiple inheritance
我读过这个但是我不确定我是否理解过载
适用部分:https://wiki.qt.io/New_Signal_Slot_Syntax
我有qt5.4.1,Visual Studio 2013.
将新的 'connect' 语法与虚拟槽和基本 class 对象指针一起使用时没有问题。您正在指定对象实例(例如 currentReader
),要调用的具体方法将使用此对象的虚方法 table.
解析
免责声明:我不熟悉Qt。然而,这里的问题似乎是一个 C++ 问题。
当在基 class 中使用指向虚函数的成员指针时,在 pointer/reference 到派生 class 上,派生 class 中的重写=] 将被调用(如果它存在)。
class Base
{
public:
virtual void f()
{
std::cout << "Base\n";
}
};
class Derived : public Base
{
public:
virtual void f()
{
std::cout << "Derived\n";
}
};
int main()
{
void (Base::* pmf)() = &Base::f;
Derived d;
(d.*pmf)();
}
将打印 "Derived",而不是 "Base";
如果 Qt 信号使用派生对象调用您的成员函数指针,函数覆盖将因此被调用。
我正尝试在一些遗留代码中使用新的连接语法,但遇到了体系结构问题。所以让我们假设我有一个 BaseReader class 看起来像这样:
class BaseReader : public QObject
{
Q_OBJECT
public:
BaseReader();
public slots:
virtual void read(const fstream& myStream);
}
那么假设我有一些 children class这样的
class Reader1 : public BaseReader
{
Q_OBJECT
public:
BaseReader();
public slots:
virtual void read(const fstream& myStream);
}
一些读取工作在 class 基地完成,一些在 child class 完成。我有大约 4 个 classes 在运行时切换。我有一个 connectReaders 函数,如下所示:
void connectReaders(BaseReader* currentReader)
{
connect(this, SIGNAL(mustRead(const fstream&)), currentReader, SLOT(read(const fstream&)));
}
现在我的理解是,如果我使用新语法,我将连接到基本成员函数,而不是重载版本。那是对的吗 ?有没有办法在不修改架构的情况下使用新语法连接这些信号?我的示例非常简单,修改该代码需要几个月的时间(包括测试)。它以旧方式工作,但我想利用新语法。有什么想法吗?
我查看了这些线程,但它们似乎没有提供解决此问题的方法:
这是反过来的: Using Qt signals and slots with multiple inheritance
我读过这个但是我不确定我是否理解过载 适用部分:https://wiki.qt.io/New_Signal_Slot_Syntax
我有qt5.4.1,Visual Studio 2013.
将新的 'connect' 语法与虚拟槽和基本 class 对象指针一起使用时没有问题。您正在指定对象实例(例如 currentReader
),要调用的具体方法将使用此对象的虚方法 table.
免责声明:我不熟悉Qt。然而,这里的问题似乎是一个 C++ 问题。
当在基 class 中使用指向虚函数的成员指针时,在 pointer/reference 到派生 class 上,派生 class 中的重写=] 将被调用(如果它存在)。
class Base
{
public:
virtual void f()
{
std::cout << "Base\n";
}
};
class Derived : public Base
{
public:
virtual void f()
{
std::cout << "Derived\n";
}
};
int main()
{
void (Base::* pmf)() = &Base::f;
Derived d;
(d.*pmf)();
}
将打印 "Derived",而不是 "Base";
如果 Qt 信号使用派生对象调用您的成员函数指针,函数覆盖将因此被调用。