我刚开始学习Qt几天前制作游戏,我正试图找出如何使布局工作。
我想要的是一个使用QStackedLayout的Window,里面有两个小部件:StartScreen和GameScreen。程序运行时,StartScreen显示在顶部。 StartScren中的一个按钮连接到Window内的一个函数,Window将调用setCurrentIndex将顶部的小部件更改为GameScreen。
现在发生的事情是,当我点击按钮时,视图会变为空白窗口。我试过硬编码setCurrentIndex(0),它什么都不做,setCurrentIndex(1),这是GameScreen应该是什么,并显示相同的空白窗口,和setCurrentIndex(2),这是超出索引范围但仍然什么都不做。所以连接正在进行,但我不明白为什么会出现一个空白窗口而不是我在GameScreen上的按钮。
如果有人能向我解释我错过了什么概念以及如何解决这个问题,我将非常感激。谢谢!
这是window.cpp:
Window::Window(QWidget *parent) : QWidget(parent)
{
resize(640, 480);
layout = new QStackedLayout;
createStartScreen();
createGameScreen();
setLayout(layout);
show();
};
void Window::createStartScreen(){
start = new StartScreen();
layout->addWidget(start);
start->setWindow(this);
}
void Window::playGame(){
layout->setCurrentIndex(layout->indexOf(game));
}
void Window::createGameScreen(){
game = new GameScreen();
layout->addWidget(game);
}
startscreen.cpp:
StartScreen::StartScreen(QWidget *parent) : QWidget(parent)
{
newGameButton = new QPushButton("New Game", this);
newGameButton->setGeometry(QRect(QPoint(260, 300), QSize(120,40)));
quitButton = new QPushButton("Quit", this);
quitButton->setGeometry(QRect(QPoint(260, 360), QSize(120,40)));
connect(quitButton, SIGNAL(clicked()), QApplication::instance(), SLOT(quit()));
};
void StartScreen::setWindow(Window *w){
connect(newGameButton, SIGNAL(clicked()), w, SLOT(playGame()));
}
gamescreen.cpp:
GameScreen::GameScreen(QWidget *parent) : QWidget(parent)
{
button = new QPushButton("Hi");
button->setGeometry(QRect(QPoint(260, 260), QSize(120,40)));
};
答案 0 :(得分:0)
那是因为你没有在按钮上调用show。但你应该使用布局来处理它。
e.g:
GameScreen::GameScreen(QWidget *parent)
: QWidget(parent)
{
button = new QPushButton(tr("Hi"));
QHBoxLayout *layout = new QHBoxLayout(this);
layout->addWidget(button);
};
按钮的大小适合其文本,并将在GameScreen中进行清理。
另外,您应该向StartScreen添加一个信号以请求新游戏并在Window中进行连接。这样,您就不会在StartScreen和Window之间建立紧密耦合。