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) 创建一个助手类来传递按钮单击信号,并为需要映射的每个按钮创建该类的对象-保护按钮本身。