2013-12-10 4 views
0

Я попытался сделать кучу исследований о том, как решить эту проблему, и все немного отличается от моей ситуации или не работает, чтобы исправить мою проблему. Я начну с объяснения своей главной цели. У меня есть главное окно с 7 кнопками на нем (между прочим), когда вы нажимаете каждую кнопку, он закрывает текущее окно и открывает новое окно. Все окна будут иметь одинаковые 7 кнопок, поэтому вы можете переключаться между каждым окном. Когда все окна имеют одинаковые 7 кнопок, я хотел бы настроить функцию, которую каждый класс может вызвать для настройки каждой кнопки и подключиться к слоту() в моем mainwindow.cpp (называемом setupSubsystemButtons в примере ниже). Фактические кнопки размещаются там, но они работают только при нажатии с моего mainwindow.cpp .... когда я нажимаю их из другого класса, ничего не происходит.Подключение кнопок к разъему mainwindows

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

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

}; 

#endif // MAINWINDOW_H 

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

} 

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 

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); 
}; 

ответ

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

Это создаст кнопки и подключит их сигналы к слотам setupButtons, которые будут удалены, как только они выйдут из области видимости (конец конструктора ECSgeneralCommand). Таким образом, ваши кнопки не будут связаны ни с чем.

Вам необходимо подключить сигналы кнопок к объекту, который будет существовать во время нажатия кнопки, например, сам ECSgeneralCommand. Затем он может закрыть себя и создать правильное окно.

Или, возможно, гораздо лучшее решение, применимое для вашего приложения: используйте одно главное окно с QStackedWidget, которое переключает виджеты при нажатии кнопки. Это то, что обычно делается.

+0

Я не знал о QStackedWidget, похоже, что это было бы идеально для моего приложения. Спасибо за ответ и предложение. – user2494298

Смежные вопросы