我将首先解释我的主要目标。我有一个主窗口,上面有7个按钮(除此之外),当你按下每个按钮时,它会关闭当前窗口并打开一个新窗口。所有窗口都有相同的7个按钮,因此您可以在每个窗口之间切换。由于所有窗口都具有完全相同的7个按钮,我想设置一个函数,每个类可以调用它来设置每个按钮并连接到mainwindow.cpp中的一个槽()(在下面的示例中称为setupSubsystemButtons)。但是,我似乎无法使用标准的“this-> close()”来关闭窗口......当我从主窗口转到另一个窗口(主窗口关闭)时它会起作用但是当我走的时候从不同的窗口说出主窗口,不同的窗口不关闭。建议将不胜感激。我的猜测是,在调用另一个类中的插槽时,我对“this”的理解是错误的。
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 :(得分:1)
插槽只是正常功能。当Qt调用一个槽时,它最终会调用适当的接收方法。换句话说,this
等于connect
语句的第3个参数的值。你在那里传递了this
,所以接收者是MainWindow对象。例如。 MainWindow::homeScreen
方法始终尝试关闭MainWindow
。如果它已被隐藏,则此操作不起作用。
您应该在每个窗口类中都有一个插槽,并将按钮连接到适当的接收器,或者在调用this
时使用指向当前活动窗口而不是close()
的指针。但是你的架构首先是奇怪的。为什么需要为每个窗口创建这些按钮?创建它们一次并在所有窗口中使用是合理的。还没有必要隐藏和显示窗口。您可以创建一个带有按钮的主窗口和一个包含所有其他窗口内容的QStackedWidget
。也许您甚至可以使用QTabWidget
代替这些按钮。