我有这段代码,它为Qt 4编写了一个mdi窗口:
class MdiWindow : public QMainWindow
{
Q_OBJECT
public:
MdiWindow( QWidget *parent = nullptr)
...
private:
QWorkspace* workspace
QSignalMapper* mapper
}
MdiWindow::MdiWindow( QWidget *parent ) : QMainWindow( parent )
{
...
workspace = new QWorkspace;
setCentralWidget( workspace );
connect( workspace, SIGNAL(windowActivated(QWidget *)), this, SLOT(enableActions()));
mapper = new QSignalMapper( this );
connect( mapper, SIGNAL(mapped(QWidget*)), workspace, SLOT(setActiveWindow(QWidget*)) );
....
}
根据QT文档QWorkspace
应替换为QMdiArea
。
我这样做并像这样编写了第一个连接:
connect(workspace, &QMdiArea::subWindowActivated,
this, &MdiWindow::enableActions);
但是QSignalMapper
呢,这也被弃用了。
那么我该如何更新这一行:
mapper = new QSignalMapper( this );
connect( mapper, SIGNAL(mapped(QWidget*)), workspace, SLOT(setActiveWindow(QWidget*)) );
我读到QSignalMapper
可以用lamda代替,但在这种情况下如何?如果我理解正确,mapper
将所有信号从此转发到workspace
的活动窗口
以前,您使用QSignalMapper::setMapping()
来确保在调用SLOT()
时向您发送所需的数据。现在你可以把这个逻辑封装在lamba中,所以如果你这样做了(如Qt的例子(:
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, texts[i]);
}
connect(signalMapper, SIGNAL(mapped(const QString &)),
this, SIGNAL(clicked(const QString &)));
您现在可以(有点(:
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
connect(button, &QPushButton::clicked, [=]() {
emit clicked(texts[i]);
});
}
如果未使用setMapping()
,则它可能已经直接连接到SLOT()
。