1

我有这段代码,它为 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的可以用 lamdas 代替,但在这种情况下怎么办?如果我理解正确mapper,则将所有信号从这里转发到活动窗口workspace

4

1 回答 1

4

以前,您曾经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()

于 2019-05-31T20:10:50.030 回答