我有这样的代码,它为 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*)) );
....
}
Run Code Online (Sandbox Code Playgroud)
根据 QT 文档QWorkspace应该替换为QMdiArea.
我这样做了并编写了第一个连接,如下所示:
connect(workspace, &QMdiArea::subWindowActivated,
this, &MdiWindow::enableActions);
Run Code Online (Sandbox Code Playgroud)
但那QSignalMapper也被弃用了呢?
那么我该如何更新这一行:
mapper = new QSignalMapper( this );
connect( mapper, SIGNAL(mapped(QWidget*)), workspace, SLOT(setActiveWindow(QWidget*)) );
Run Code Online (Sandbox Code Playgroud)
我读到QSignalMapper可以用 lamdas 替换,但在这种情况下如何替换?如果我明白,则将mapper所有信号从这里转发到活动窗口workspace
以前,您通常QSignalMapper::setMapping()要确保在调用时会向您发送所需的数据SLOT()。现在你可以将此逻辑封装在lambda中,所以如果你这样做了(就像在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 &)));
Run Code Online (Sandbox Code Playgroud)
你现在可以做(某种程度上):
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
connect(button, &QPushButton::clicked, [=]() {
emit clicked(texts[i]);
});
}
Run Code Online (Sandbox Code Playgroud)
如果setMapping()没有使用,那么它可能已经直接连接到了SLOT()。
| 归档时间: |
|
| 查看次数: |
3029 次 |
| 最近记录: |