2013-08-27 4 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())); 
Смежные вопросы