[英]Using Qt5 new connect syntax with inheritance
我試圖在一些舊代碼中使用新的connect語法,但是遇到了體系結構問題。 因此,讓我們假設我有一個類似下面的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個在運行時切換的類。 我有一個connectReaders函數,看起來像這樣:
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 << "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信號使用派生對象調用成員函數指針,則將調用函數重寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.