2013-12-10 89 views
0

我試圖做關於如何解決這個問題一堆的研究,一切比我的情況略有不同,或沒有工作來解決我的問題。我將首先解釋我的主要目標。我有一個帶有7個按鈕的主窗口(其中包括),當您按下每個按鈕時,它將關閉當前窗口並打開一個新窗口。所有窗口將具有相同的7個按鈕,因此您可以在每個窗口之間進行切換。所有窗口都有相同的7個按鈕,我想設置一個函數,每個類都可以調用每個按鈕來設置每個按鈕並連接到我的mainwindow.cpp中的slot()(在下面的示例中稱爲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