gpt4 book ai didi

c++ - 如何将同一个 Widget 连接到多个 QSignalMapper 映射

转载 作者:行者123 更新时间:2023-11-28 00:59:12 25 4
gpt4 key购买 nike

this question 开始,我有一个菜单系统如下:

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

但是,当我单击加载按钮时,会显示 MainMenu。这是我的代码:

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) QSignalMapperQObject* sender 映射到(in​​t、string、QWidget* 或 QObject*)。由于您的“加载”和“返回主菜单”信号是从同一发送者对象发送的,因此它们将以相同的方式映射。解决方案是将不同按钮的 clicked 信号直接连接到映射器(而不是通过您的 LoadGameMenu 对象),因此 sender 是不同。

2) 由于您使用的是 QStackedWidget,因此我会强烈考虑使用 QSignalMapperQWidget* 映射,并连接到 QStackedWidget::setCurrentWidget。如果/当您添加更多菜单屏幕时,这将更容易维护,而不是试图跟上哪个 int 索引是哪个小部件。在我看来,它还使您的代码更具可读性。

编辑:您似乎没有理解 setMapping 函数。我会看一下文档以获得更好的主意。您在那里所做的是将第一个参数(发送者)映射到要发送的信号(第二个参数)。在您的原始代码中,您将 LoadGameMenu 映射到 0。任何时候从 LoadGameMenu 向映射器发送信号时,0 都会发送到 stackedWidget::setCurrentIndex` - 这就是为什么两个按钮都会将您返回到同一个地方。

关于c++ - 如何将同一个 Widget 连接到多个 QSignalMapper 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9660602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com