Окно Qt не закроется с помощью функции «this-> gt; close ()» из другого класса

Я начну с объяснения моей главной цели. У меня есть главное окно с 7 кнопками (среди прочего), когда вы нажимаете каждую кнопку, оно закрывает текущее окно и открывает новое окно. Все окна будут иметь одинаковые 7 кнопок, поэтому вы можете переходить между ними. Во всех окнах, имеющих одинаковые 7 кнопок, я хотел установить функцию, которую каждый класс может вызывать, чтобы настроить каждую кнопку и подключиться к slot () в моем mainwindow.cpp (называемом setupSubsystemButtons в примере ниже). Тем не менее, я не могу заставить окно закрываться с помощью стандартного «this-> close ()» … оно работает, когда я перехожу из главного окна в другое окно (главное окно закрывается), но когда я иду из другое окно, чтобы сказать домашнее окно, другое окно не закрывается. Предложения будут с благодарностью. Я предполагаю, что мое понимание «этого», когда дело доходит до вызова слотов в другом классе, неверно.

mainwindow.cpp (части, которые имеют отношение)

void MainWindow::ECSgeneralScreen()
{
ECSgeneralCommand *ECSgeneral = new ECSgeneralCommand;
this->close();
ECSgeneral->show();
//opens up the ECS screen
}

void MainWindow::homeScreen()
{
MainWindow *home = new MainWindow;
this->close();
home->show();
//opens up the ECS screen
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::setupSubsystemButtons(QGridLayout *layout)
{
//Push Button Layout
homeScreenButton = new QPushButton("Home");
layout->addWidget(homeScreenButton, 3, 11);
connect(homeScreenButton, SIGNAL(clicked()), this, SLOT(homeScreen()));

ECSgeneralScreenButton = new QPushButton("General");
layout->addWidget(ECSgeneralScreenButton,5,11);
connect(ECSgeneralScreenButton, SIGNAL(clicked()), this, SLOT(ECSgeneralScreen()));
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtWidgets>
#include <QDialog>namespace Ui {
class MainWindow;
}

class MainWindow : public QDialog
{
Q_OBJECT

public:
MainWindow(QWidget *parent = 0);
QWidget *window;
void setupSubsystemButtons(QGridLayout *layout);
~MainWindow();
private slots:

public slots:
void ECSgeneralScreen();
void homeScreen();

};

#endif // MAINWINDOW_H

ecsgeneralcommandWindow

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

ECSgeneralCommand::ECSgeneralCommand(MainWindow *parent) :   QDialog(parent)
{
QGridLayout *layout = new QGridLayout;
QWidget::setFixedHeight(600);
QWidget::setFixedWidth(650);

...//Setup Subsystem Buttons
test.setupSubsystemButtons(layout);

setLayout(layout);
}

заголовок ecsgeneralcommandWindow

#ifndef ECSGENERALCOMMAND_H
#define ECSGENERALCOMMAND_H

#include <QDialog>
#include <QMainWindow>
#include <QtWidgets>
#include <QObject>
#include "mainwindow.h"
class ECSgeneralCommand : public QDialog
{
Q_OBJECT

public:
explicit ECSgeneralCommand(MainWindow *parent = 0);

private:
MainWindow test;
public slots:

};

#endif // ECSGENERALCOMMAND_H

0

Решение

Слоты просто нормальные функции. Когда Qt вызывает слот, он заканчивает тем, что вызывает соответствующий метод получателя. Другими словами, this равно значению третьего аргумента вашего connect заявления. Вы прошли this там, так что получатель является объектом MainWindow. Например. MainWindow::homeScreen метод всегда пытается закрыть MainWindow, Если оно уже скрыто, это действие не действует.

Вы должны либо иметь слот в каждом классе окна и подключать кнопки к соответствующим получателям, либо использовать указатель на текущее активное окно вместо this при звонке close(), Но ваша архитектура странная в первую очередь. Зачем вам нужно создавать эти кнопки для каждого окна? Целесообразно создать их один раз и использовать во всех окнах. Также скрывать и показывать окна не обязательно. Вы можете создать одно главное окно с кнопками и QStackedWidget это будет содержать содержимое всех других окон. Может быть, вы даже можете использовать QTabWidget вместо этих кнопок.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]