2013-08-27 77 views
2

嗨,大家好,我很新的Qt編程,我想用QStackedLayout創建一個窗口小部件。我已經使用Qt Creator設計了一些小部件,將它們添加到QStackedLayout並將其設置爲主小部件。但是現在我想使用setCurrentIndex方法使用添加的小部件中的按鈕更改小部件。現在我必須使用connect函數,但在主窗口小部件類中,我無法訪問其他窗口小部件中的組件來連接它們。那我該怎麼做?使用QStackedLayout創建窗口小部件

#include "mainwindowwidget.h" 
#include "ui_mainwindowwidget.h" 


MainWindowWidget::MainWindowWidget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::MainWindowWidget) 
{ 


    qApp->setStyleSheet("MainWindowWidget {background-color : red}"); 

    //initializing widgets 
    this->mainWidget_ = new MainWidget; 
    this->createGameWidget_ = new CreateGameWidget; 
    this->widgets_ = new QStackedLayout; 


    //adding widgets to QstackedLayout 
    this->widgets_->addWidget(this->mainWidget_); 
    this->widgets_->addWidget(this->createGameWidget_); 

    this->setLayout(this->widgets_); 
    this->showFullScreen(); 
    // I would like to connect the qstackedlayout 
    // = widgets_ with a button placed in mainwidget_ 
    ui->setupUi(this); 

} 

MainWindowWidget::~MainWindowWidget() 
{ 
    delete ui; 
} 

回答

0

從Qt的援助

The QStackedLayout class provides a stack of widgets where only one widget is visible at a time. 

所以通過指數是標識微件需要在特定時間點來顯示在StackedLayout一個關鍵的事情。假設你的信號名稱爲 「激活(INT)」 的中mainWidget_和createGameWidget_

宣佈

所以你需要象這樣連接

//MainWindowWidget class. 
connect(MainWidget, SIGNAL(activated(int)), widgets_ , SLOT(setCurrentIndex(int))); 
connect(createGameWidget_, SIGNAL(activated(int)), widgets_ , SLOT(setCurrentIndex(int))); 
//In MainWidget class you need to emit signal 
    MainWidget::ChangeLayout() 
    { 
     emit activated(1); //createGameWidget_will be displayed 
    } 

    //In createGameWidget_class you need to emit signal 
    createGameWidget_::ChangeLayout() 
    { 
     emit activated(0); //MainWidget will be displayed 
    } 
+0

感謝,幫助了很多 – quique

1

您有幾種選擇這裏。如果您的按鈕是MainWidget的公共成員,則只需將按鈕的clicked()信號連接到MainWindow中的插槽即可。

//mainwindow.h 
... 
public slots: 
    void buttonClicked(); 

//mainwindow.cpp 
... 
    connect(mainWidget_->button, SIGNAL(clicked()), this, SLOT(buttonClicked())); 
... 
void buttonClicked() 
{ 
    //do what you want to do here... 
} 

另一種選擇是建立在你MainWidget類的定製信號。然後,你的按鈕的clicked()信號連接到這個自定義信號:

//mainwidget.h 
... 
signals: 
    void buttonClickedSignal(); 

//mainwidget.cpp 
    connect(button, SIGNAL(clicked()), this, SIGNAL(buttonClickedSignal())); 

然後你buttonClickedSignal()信號連接到插槽您MainWindow

//mainwindow.cpp 
    connect(mainWidget_, SIGNAL(buttonClickedSignal()), this, SLOT(buttonClicked())); 

第三種選擇是向你的MainWidget類添加一個函數,該函數返回一個指向你的按鈕的指針。然後在MainWindow類中調用此函數,並使用該指針將按鈕連接到插槽。

//mainwidget.h 
... 
public: 
    QPushButton* getButton(); 
... 

//mainwdiget.cpp 
... 
QPushButton* getButton() 
{ 
    return button; 
} 
... 

//mainwindow.cpp 
... 
    QPushButton *button = mainWidget_->getButton(); 
    connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked())); 
相關問題