Qt 将按钮连接到主Windows插槽

Qt 将按钮连接到主Windows插槽,qt,slots,Qt,Slots,我试着做了一系列关于如何解决这个问题的研究,但一切都与我的情况略有不同,或者没有解决我的问题。我将从解释我的主要目标开始。我有一个主窗口,上面有7个按钮(除其他外),当你按下每个按钮时,它会关闭当前窗口并打开一个新窗口。所有窗口都有相同的7个按钮,因此您可以在每个窗口之间切换。由于所有窗口都有完全相同的7个按钮,我想设置一个函数,每个类都可以调用该函数来设置每个按钮并连接到mainwindow.cpp中的slot()(在下面的示例中称为setupsubsystembutions)。实际的按钮被放

我试着做了一系列关于如何解决这个问题的研究,但一切都与我的情况略有不同,或者没有解决我的问题。我将从解释我的主要目标开始。我有一个主窗口,上面有7个按钮(除其他外),当你按下每个按钮时,它会关闭当前窗口并打开一个新窗口。所有窗口都有相同的7个按钮,因此您可以在每个窗口之间切换。由于所有窗口都有完全相同的7个按钮,我想设置一个函数,每个类都可以调用该函数来设置每个按钮并连接到mainwindow.cpp中的slot()(在下面的示例中称为setupsubsystembutions)。实际的按钮被放置在那里,但它们只有在从我的主窗口.cpp中按下时才起作用……当我从另一个类中按下它们时,什么也没有发生

主窗口

#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:
Ui::MainWindow *ui;

QLineEdit *tempValueBox;
QLineEdit *humidityValueBox;
QLineEdit *c02ValueBox;
...
public slots:
void ECSgeneralScreen();
void homeScreen();

};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QDialog
{
Q_对象
公众:
主窗口(QWidget*父窗口=0);
QWidget*窗口;
无效设置子系统按钮(QGridLayout*布局);
~main窗口();
私人:
Ui::MainWindow*Ui;
QLineEdit*临时值框;
QLineEdit*湿度值框;
QLineEdit*c02ValueBox;
...
公众时段:
void ECSgeneralScreen();
void主屏幕();
};
#endif//main窗口
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ecsgeneralcommand.h"

#include <QtWidgets>
#include <QtCore>

MainWindow::MainWindow(QWidget *parent) : QDialog(parent)
{

    QGridLayout *layout = new QGridLayout;
...
setLayout(layout);

}

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 home 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”
#包括“ui_main window.h”
#包括“ecsgeneralcommand.h”
#包括
#包括
MainWindow::MainWindow(QWidget*父项):QDialog(父项)
{
QGridLayout*layout=新的QGridLayout;
...
设置布局(布局);
}
void主窗口::ECSgeneralScreen()
{
ECSgeneralCommand*ECSgeneral=新的ECSgeneralCommand;
此->关闭();
ECSgeneral->show();
//打开ECS屏幕
}
void主窗口::主屏幕()
{
主窗口*home=新主窗口;
此->关闭();
主页->显示();
//打开主屏幕
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::设置子系统按钮(QGridLayout*布局)
{
//按钮布局
homeScreenButton=新的QPushButton(“主页”);
布局->添加小部件(homeScreenButton,3,11);
连接(主屏幕按钮、信号(单击())、此、插槽(主屏幕());
ECSgeneralScreenButton=新的QPushButton(“常规”);
布局->添加小部件(ECSgeneralScreenButton,5,11);
连接(ECSgeneralScreen按钮、信号(单击())、此、插槽(ECSgeneralScreen());
}
ecsgeneralcommand.h

#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:
    ...

public slots:

};

#endif // ECSGENERALCOMMAND_H
\ifndef ECSGENERALCOMMAND\u H
#定义ECSGENERALCOMMAND_H
#包括
#包括
#包括
#包括
#包括“mainwindow.h”
类别ECS通用命令:公共QDialog
{
Q_对象
公众:
显式ECSgeneralCommand(主窗口*parent=0);
私人:
...
公众时段:
};
#endif//ECSGENERALCOMMAND\u H
ecsgeneralcommand.cpp

#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(550);

    ...

    MainWindow setupButtons;
    //Setup Subsystem Buttons
    setupButtons.setupSubsystemButtons(layout);


    setLayout(layout);
};
#包括“ecsgeneralcommand.h”
#包括“mainwindow.h”
#包括
#包括
ECSgeneralCommand::ECSgeneralCommand(主窗口*父级):QDialog(父级)
{
QGridLayout*layout=新的QGridLayout;
QWidget::setFixedHeight(600);
QWidget::setFixedWidth(550);
...
主窗口设置按钮;
//设置子系统按钮
设置按钮。设置子系统按钮(布局);
设置布局(布局);
};
这将创建按钮并将其信号连接到
setupButtons
的插槽,一旦超出范围(ECSgeneralCommand构造函数的末尾),该插槽将被删除。因此,您的按钮将保持连接状态

您需要将按钮信号连接到按下按钮时存在的对象,例如
ECSgeneralCommand
本身。然后它可以关闭自己并生成正确的窗口


或者,如果适用于您的应用程序,可能是一个更好的解决方案:使用一个单一的主窗口,带有一个
QStackedWidget
,当按下按钮时切换小部件。这就是通常的做法。

我不知道QStackedWidget,它似乎非常适合我的应用程序。谢谢你的回答和建议。
    MainWindow setupButtons;
    //Setup Subsystem Buttons
    setupButtons.setupSubsystemButtons(layout);