使用 Qt5 新连接语法与继承



我正在尝试在某些遗留代码中使用新的连接语法,但遇到了架构问题。所以让我们假设我有一个看起来像这样的 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信号使用派生对象调用成员函数指针,则将因此调用函数覆盖。

相关内容

  • 没有找到相关文章

最新更新