C++ 如何将同一小部件连接到多个QSignalMapper映射

C++ 如何将同一小部件连接到多个QSignalMapper映射,c++,qt,menu,mapping,signals-slots,C++,Qt,Menu,Mapping,Signals Slots,从开始,我有一个菜单系统,如下所示: MainMenu > (Load Game button clicked) > LoadGameMenu LoadGameMenu > (Back To Main Menu button clicked) > MainMenu LoadGameMenu > (Load button clicked) > GameScreen 但是,当我单击Load按钮时,会显示Main菜单。这是我的密码: ApplicationWind

从开始,我有一个菜单系统,如下所示:

MainMenu > (Load Game button clicked) > LoadGameMenu
LoadGameMenu > (Back To Main Menu button clicked) > MainMenu
LoadGameMenu > (Load button clicked) > GameScreen
但是,当我单击Load按钮时,会显示Main菜单。这是我的密码:

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);
}
我知道我的信号映射有问题,但我不知道它是什么

干杯。

1)
QSignalMapper
QObject*发送方映射到(int、string、QWidget*或QObject*)。由于“加载”和“返回主菜单”信号是从同一发送者对象发送的,因此它们将以相同的方式映射。解决方案是将不同按钮的
点击的
信号直接连接到映射器(而不是通过
加载游戏菜单
对象),因此发送者是不同的

< P > 2)由于您使用的是<代码> QStaskDeWIDGET ,我强烈考虑使用<代码> QWIDGET*>代码>映射<代码> QS信卡映射器< /C> >,并连接到<代码> QStaskDeWIDGET::SturrConnect WIDGET < /C>。如果/当您添加更多的菜单屏幕,而不是试图跟上哪个
int
index是哪个小部件,那么这将更容易维护。在我看来,它还使代码更具可读性

编辑:看起来您不理解
setMapping
函数。我想看看这些文件,看看有没有更好的主意。这里要做的是将第一个参数(发送方)映射到要发送的信号(第二个参数)。在原始代码中,您正在将
LoadGameMenu
映射到
0
。无论何时从
LoadGameMenu
向映射器发送信号,
0
都会发送到stackedWidget::setCurrentIndex`-这就是为什么两个按钮都会将您返回到同一位置

1)
QSignalMapper
QObject*发送方
映射到(int、string、QWidget*或QObject*)。由于“加载”和“返回主菜单”信号是从同一发送者对象发送的,因此它们将以相同的方式映射。解决方案是将不同按钮的
点击的
信号直接连接到映射器(而不是通过
加载游戏菜单
对象),因此发送者是不同的

< P > 2)由于您使用的是<代码> QStaskDeWIDGET ,我强烈考虑使用<代码> QWIDGET*>代码>映射<代码> QS信卡映射器< /C> >,并连接到<代码> QStaskDeWIDGET::SturrConnect WIDGET < /C>。如果/当您添加更多的菜单屏幕,而不是试图跟上哪个
int
index是哪个小部件,那么这将更容易维护。在我看来,它还使代码更具可读性


编辑:看起来您不理解
setMapping
函数。我想看看这些文件,看看有没有更好的主意。这里要做的是将第一个参数(发送方)映射到要发送的信号(第二个参数)。在原始代码中,您正在将
LoadGameMenu
映射到
0
。无论何时从
LoadGameMenu
向映射器发送信号,
0
都会发送到stackedWidget::setCurrentIndex`-这就是为什么两个按钮都会将您返回到同一位置

QSignalMapper
依赖于信号的发送方来进行映射,您将连接
loadGameMenu
两次

如果发件人是
loadGameMenu
,它将始终显示索引0


最好直接连接到
loadGameMenu
小部件中的按钮

QSignalMapper
依赖于信号的发送方来进行映射,您将连接
loadGameMenu
两次

如果发件人是
loadGameMenu
,它将始终显示索引0


最好直接连接到
loadGameMenu
小部件中的按钮

谢谢@tPearce。我不确定我是否喜欢公开
LoadGameMenu
的按钮。。。有更好的方法吗?新代码(尚未直接连接所有按钮):@Mitch您有多个选项。。。1) 将信号映射器(可能还有按钮应该映射到的int/QWidget*)传递到LoadGameMenu;这会将信号映射器暴露给该类,因此您必须决定它是否更好,也许封装得比现在好一点。2) 让menu类执行
connect
(如1所示),并将
QObject*
而不是
QPushButton*
返回给调用者以进行映射;3) 创建一个助手类来传递按钮单击信号,并为需要映射的每个按钮创建该类的对象-保护按钮本身。谢谢@tmpearce。我不确定我是否喜欢公开
LoadGameMenu
的按钮。。。有更好的方法吗?新代码(尚未直接连接所有按钮):@Mitch您有多个选项。。。1) 将信号映射器(可能还有按钮应该映射到的int/QWidget*)传递到LoadGameMenu;这会将信号映射器暴露给该类,因此您必须决定它是否更好,也许封装得比现在好一点。2) 让menu类执行
connect
(如1所示),并将
QObject*
而不是
QPushButton*
返回给调用者以进行映射;3) 创建一个助手类来传递按钮单击信号,并为需要映射的每个按钮创建该类的对象-保护按钮本身。