Как подключить один и тот же виджет к нескольким сопоставлениям QSignalMapper - PullRequest
0 голосов
/ 12 марта 2012

Исходя из этого вопроса , у меня система меню выглядит следующим образом:

MainMenu > (Load Game button clicked) > LoadGameMenu
LoadGameMenu > (Back To Main Menu button clicked) > MainMenu
LoadGameMenu > (Load button clicked) > GameScreen

Однако, когда я нажимаю кнопку «Загрузить», вместо этого отображается главное меню. Вот мой код:

ApplicationWindow::ApplicationWindow()
{
    resize(800, 600);

    stack = new QStackedWidget(this);
    signalMapper = new QSignalMapper(this);

    mainMenu = new MainMenu(this);
    loadGameMenu = new LoadGameMenu(this);
    gameScreen = new GameScreen(this);

    stack->addWidget(mainMenu);
    stack->addWidget(loadGameMenu);
    stack->addWidget(gameScreen);

    connect(mainMenu, SIGNAL(loadGameClicked()), signalMapper, SLOT(map()));
    connect(loadGameMenu, SIGNAL(backToMainMenuClicked()), signalMapper, SLOT(map()));
    connect(loadGameMenu, SIGNAL(loadClicked()), signalMapper, SLOT(map()));

    signalMapper->setMapping(loadGameMenu, 0);
    signalMapper->setMapping(mainMenu, 1);
    signalMapper->setMapping(gameScreen, 2);

    connect(signalMapper, SIGNAL(mapped(int)), stack, SLOT(setCurrentIndex(int)));

    setCentralWidget(stack);
}

Я знаю, что что-то не так с отображением сигнала, но я не знаю, что это такое.

Приветствие.

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

1) QSignalMapper отображает QObject* sender в (int, string, QWidget * или QObject *).Поскольку ваши сигналы «загрузка» и «возврат в главное меню» отправляются из одного и того же объекта-отправителя , они будут отображаться одинаково.Решение состоит в том, чтобы подключить сигнал clicked различных кнопок непосредственно к преобразователю (а не через ваш LoadGameMenu объект), поэтому отправитель отличается.

2) Так каквы используете QStackedWidget, я бы настоятельно рекомендовал использовать QWidget* отображение QSignalMapper и подключиться к QStackedWidget::setCurrentWidget.Это будет легче поддерживать, если / когда вы добавите больше экранов меню, чем пытаться не отставать от того, какой индекс int является каким виджетом.По моему мнению, это делает вещи более читабельными в вашем коде.

Редактировать: Похоже, вы не понимаете функцию setMapping.Я бы посмотрел на документы для лучшей идеи.То, что вы делаете, это отображение первого аргумента (отправителя) на сигнал для отправки (второй аргумент).В исходном коде вы отображаете LoadGameMenu на 0.Каждый раз, когда сигнал отправляется мапперу из LoadGameMenu, 0 отправляется в stackedWidget :: setCurrentIndex` - поэтому обе кнопки возвращают вас в одно и то же место.

1 голос
/ 12 марта 2012

QSignalMapper полагается на отправителя сигнала для сопоставления, и вы подключаетесь loadGameMenu дважды.

Если отправитель loadGameMenu, он всегда будет показывать индекс 0.

Вероятно, было бы лучше подключиться непосредственно к кнопкам внутри вашего loadGameMenu виджета.

...