为什么要打开 2 windows?

why opening 2 windows?

我的 QT 应用程序正在打开两个 windows。一个是空的,一个是显示 button1 的。谁能告诉我为什么?

我什么都试过了,还是找不到问题的根源。如果有人可以帮助我。

main.cpp

#include <QtWidgets>
#include "./mainwindow.h"

int main(int argc, char **argv)
{
    QApplication app (argc, argv);
    MainWindow myWindow;
    myWindow.show();
    return app.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStackedWidget>


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QtWidgets>

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
{
    QWidget *page1 = new QWidget();
    QWidget *page2 = new QWidget();
    QGridLayout *layout = new QGridLayout();
    QGridLayout *layout1 = new QGridLayout();
    QPushButton *button = new QPushButton("Página 1", page1);
    QPushButton *button1 = new QPushButton("Página 2", page2);
    button->show();
    button1->show();
    layout->addWidget(button, 0, 0);
    layout1->addWidget(button1, 0, 0);
    page1->setLayout(layout);
    page2->setLayout(layout1);
    layout->setColumnMinimumWidth(0, 30);
    QStackedWidget *mainContainer = new QStackedWidget(parent);
    mainContainer->addWidget(page1);
    mainContainer->addWidget(page2);
    mainContainer->setCurrentIndex(1);
}

why opening 2 windows?

在 QT 中,按钮是小部件,小部件可以在它们自己的 window 中显示为独立对象,例如通过调用方法 show() 就像您在 button->show();button1->show();

如果您对主要 window 使用 QWidget::show() 方法,则不需要对所有 UI 对象(如按钮、列表小部件、行编辑等)使用此方法

我认为它来自这一行:

QStackedWidget *mainContainer = new QStackedWidget(parent);

您应该为 QStackedWidget 提供 this 而不是 parent,因为您的 MainWindow 的父级为空,我猜您可能希望 StackWidget 包含在您的 MainWindow 中。

此外,您可能应该将主容器设置为主 window 的中央小部件。 这样的事情应该有效:

QWidget *page1 = new QWidget(this);
QWidget *page2 = new QWidget(this);
QGridLayout *layout = new QGridLayout(page1);
QGridLayout *layout1 = new QGridLayout(page2);
QPushButton *button = new QPushButton("Página 1", page1);
QPushButton *button1 = new QPushButton("Página 2", page2);
layout->addWidget(button, 0, 0);
layout1->addWidget(button1, 0, 0);
layout->setColumnMinimumWidth(0, 30);
QStackedWidget *mainContainer = new QStackedWidget(this);
mainContainer->addWidget(page1);
mainContainer->addWidget(page2);
mainContainer->setCurrentIndex(1);
setCentralWidget(mainContainer);

显示多个 windows 的原因是因为 parent 设置为 nullptr,这意味着 MainWindow class 和QStackedWidget 实例是顶级小部件。

如果你想让QStackWidget成为主部件的子部件,你需要给它一个父部件,最合适的是中央部件。

更改代码的以下行:

QStackedWidget *mainContainer = new QStackedWidget(centralWidget());