Я начну с объяснения моей главной цели. У меня есть главное окно с 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
Слоты просто нормальные функции. Когда Qt вызывает слот, он заканчивает тем, что вызывает соответствующий метод получателя. Другими словами, this
равно значению третьего аргумента вашего connect
заявления. Вы прошли this
там, так что получатель является объектом MainWindow. Например. MainWindow::homeScreen
метод всегда пытается закрыть MainWindow
, Если оно уже скрыто, это действие не действует.
Вы должны либо иметь слот в каждом классе окна и подключать кнопки к соответствующим получателям, либо использовать указатель на текущее активное окно вместо this
при звонке close()
, Но ваша архитектура странная в первую очередь. Зачем вам нужно создавать эти кнопки для каждого окна? Целесообразно создать их один раз и использовать во всех окнах. Также скрывать и показывать окна не обязательно. Вы можете создать одно главное окно с кнопками и QStackedWidget
это будет содержать содержимое всех других окон. Может быть, вы даже можете использовать QTabWidget
вместо этих кнопок.
Других решений пока нет …