Qt窗口不会使用来自另一个类的“this-> close()”关闭

时间:2013-12-10 20:34:18

标签: c++ qt slots

我将首先解释我的主要目标。我有一个主窗口,上面有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

1 个答案:

答案 0 :(得分:1)

插槽只是正常功能。当Qt调用一个槽时,它最终会调用适当的接收方法。换句话说,this等于connect语句的第3个参数的值。你在那里传递了this,所以接收者是MainWindow对象。例如。 MainWindow::homeScreen方法始终尝试关闭MainWindow。如果它已被隐藏,则此操作不起作用。

您应该在每个窗口类中都有一个插槽,并将按钮连接到适当的接收器,或者在调用this时使用指向当前活动窗口而不是close()的指针。但是你的架构首先是奇怪的。为什么需要为每个窗口创建这些按钮?创建它们一次并在所有窗口中使用是合理的。还没有必要隐藏和显示窗口。您可以创建一个带有按钮的主窗口和一个包含所有其他窗口内容的QStackedWidget。也许您甚至可以使用QTabWidget代替这些按钮。