Qt - QStackedLayout setCurrentIndex显示空白窗口而不是窗口小部件

时间:2016-01-27 21:26:50

标签: qt

我刚开始学习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)));
};

1 个答案:

答案 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之间建立紧密耦合。