почему открытие 2 windows? - PullRequest
0 голосов
/ 13 июля 2020

Мое приложение QT открывает два windows. Один пустой и один с отображаемой кнопкой1. Может кто-нибудь сказать мне, почему?

Я все перепробовал, но не могу найти источник проблемы. Если кто-нибудь может мне помочь.

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);
}

Ответы [ 4 ]

1 голос
/ 13 июля 2020

Я думаю, это происходит из этой строки:

QStackedWidget *mainContainer = new QStackedWidget(parent);

Вы должны указать this вместо parent для QStackedWidget, потому что родительский элемент вашего MainWindow имеет значение null, и вы, вероятно, хотите, чтобы ваш StackWidget для включения в ваше MainWindow, я полагаю.

Кроме того, вам, вероятно, следует установить свой главный контейнер в качестве центрального виджета главного окна. Примерно так должно работать:

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);
0 голосов
/ 13 июля 2020

Причина, по которой вы получаете несколько изображений windows, заключается в том, что parent установлен в nullptr, что означает, что и класс MainWindow, и экземпляр QStackedWidget являются виджетами верхнего уровня.

Если вы хотите, чтобы QStackWidget был дочерним по отношению к главному виджету, вам нужно назначить его родительским виджетом, наиболее подходящим будет центральный виджет.

Измените следующую строку вашего кода :

QStackedWidget *mainContainer = new QStackedWidget(centralWidget());
0 голосов
/ 13 июля 2020

Если вы используете метод QWidget::show() для главного окна, вам не нужно использовать этот метод для всех объектов пользовательского интерфейса, таких как кнопки, виджеты списка, редактирование строки и т. Д. c.

0 голосов
/ 13 июля 2020

зачем открывать 2 windows?

в QT Кнопки - это виджеты, и виджеты могут отображаться как отдельные объекты в собственном окне, вызывая, например, метод show() как в button->show(); и button1->show();

...