Замена устаревшего класса QtSignalMapper для пересылки сигналов в Qt5 - PullRequest
0 голосов
/ 31 мая 2019

У меня есть этот код, который делает окно mdi, написанное для Qt 4:

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 можно заменить на лямды, но как в этом случае? Если я правильно понял, mapper перенаправляет все сигналы из этого в активное окно workspace

1 Ответ

1 голос
/ 31 мая 2019

Ранее вы использовали QSignalMapper::setMapping(), чтобы убедиться, что вам будут отправлены необходимые данные при вызове SLOT().Теперь вы можете просто инкапсулировать эту логику в ламбу, так что если вы это сделали (как в примере 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().

...