qt5 信号槽新语法遇到重载的问题

假如使用了qt5 信号槽新语法:

    QObject::connect(&newspaper, &Newspaper::newPaper,&reader,    &Reader::receiveNewspaper);

 

信号有重载的时候,比如两个信号

void newPaper(const QString &name, const QDate &date);

void newPaper(const QString &name)

会出现编译错误:

..\control\mainwindow.cpp(57): error C2664: “bool QObject::disconnect(const QMetaObject::Connection &)”: 无法将参数 2 从“overloaded-function”转换为“const char *”

..\control\mainwindow.cpp(57): note: 上下文不允许消除重载函数的歧义

 

Qt4的信号槽语法因为带了参数,所以没有问题:

QObject::connect(&newspaper, SIGNAL(newPaper(QString, QDate)),&reader, SLOT(receiveNewspaper(QString, QDate)));

而新的信号槽的语法没有参数,当函数重载,编译器不知道要取哪一个函数的地址。所以我们需要指明是哪一个函数。

如下,定义一个 名为 newPaperNameDate的类函数指针:

void (Newspaper:: *newPaperNameDate)(const QString, const QDate) = &Newspaper::newPaper;
QObject::connect(&newspaper, newPaperNameDate,
&reader, &Reader::receiveNewspaper);

也可以写在一行:

QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString, const QDate)>(&Newspaper::newPaper),
&reader,&Reader::receiveNewspaper);

同理:当槽函数有重载时,也必须指出是那个槽函数,如下:

QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString, const QDate)>(&Newspaper::newPaper),
&reader,
static_cast<void (Reader:: *)(const QString, const QDate)>(&Reader::receiveNewspaper));

 

上面使用到的是类函数指针,类函数指针简单使用方式如下:

class CA
{  
public:  
    int caAdd(int a, int b) {return a+b;}  
    int caMinus(int a, int b){return a-b;};  
};  


//定义类函数指针类型
    typedef int (CA::*PtrCaFuncTwo)(int ,int);  

//指针赋值
    PtrCaFuncTwo pFunction = &CA::caAdd;  
  
//使用指针,注意使用括号
    CA ab;  
    int c = (ab.*pFunction) (1,2);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章