Signals & Slots(Qt5) (四)

2014-11-24 02:54:24 · 作者: · 浏览: 10

[cpp]
signalMapper = new QSignalMapper(this);
signalMapper->setMapping(taxFileButton, QString("taxfile.txt"));
signalMapper->setMapping(accountFileButton, QString("accountsfile.txt"));
signalMapper->setMapping(reportFileButton, QString("reportfile.txt"));
connect(taxFileButton, &QPushButton::clicked,
signalMapper, &QSignalMapper::map);
connect(accountFileButton, &QPushButton::clicked,
signalMapper, &QSignalMapper::map);
connect(reportFileButton, &QPushButton::clicked,
signalMapper, &QSignalMapper::map);

signalMapper = new QSignalMapper(this);
signalMapper->setMapping(taxFileButton, QString("taxfile.txt"));
signalMapper->setMapping(accountFileButton, QString("accountsfile.txt"));
signalMapper->setMapping(reportFileButton, QString("reportfile.txt"));
connect(taxFileButton, &QPushButton::clicked,
signalMapper, &QSignalMapper::map);
connect(accountFileButton, &QPushButton::clicked,
signalMapper, &QSignalMapper::map);
connect(reportFileButton, &QPushButton::clicked,
signalMapper, &QSignalMapper::map);
>最后, 把mapped() signal和不同文件打开时调用的readFile() slot关联起来, 不同的按钮按下会打开不同的文件;[cpp] view plaincopyprint connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(readFile(QString)));

connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(readFile(QString)));>Qt可以使用第三方3rd Party signal-slot机制. 你甚至可以在一个项目里同时使用两种机制. 需要做的就是把下面一行代码加到qmake项目文件(.pro)中.

Qt使用第三方Signals-Slots

[cpp]
CONFIG += no_keywords

CONFIG += no_keywords>这行代码告诉Qt不要去定义moc关键字signals, slots, emit, 因为这些名字会被第三方库使用. e.g, Boost. 在定义了no_keywords标签的情况下继续使用Qt, 把源代码中Qt关键字简单地替换成相应的Qt宏: Q_SIGNALS(or Q_SIGNAL), Q_SLOTS(Q_SLOT)和Q_EMIT;


在Qt5中处理signals-slots的重载


>新的Qt5的语法为了解释和关联正确的重载函数会进行显式地转换. ClassA定义了两个重载函数作为signal;

[cpp]
class ClassA : public QObject
{
Q_OBJECT
...
signals:
void mySignal(double d);
void mySignal(QString s);
...
};

class ClassA : public QObject
{
Q_OBJECT
...
signals:
void mySignal(double d);
void mySignal(QString s);
...
};>假设有个ClassB的实例b, 它的slot有一个QString参数, 那么将ClassA的实例a上重载的第二个signal与其关联的正确方式是:[cpp] view plaincopyprint connect(&a, static_cast(&ClassA::mySignal), &b, &ClassB::mySlot);

connect(&a, static_cast(&ClassA::mySignal), &b, &ClassB::mySlot);>如果有多个重载的slot, 用同样的方式来connect;