3

大家好,我是使用 Qt 编程的新手,我想使用QStackedLayout. 我已经用 Qt Creator 设计了一些小部件,将它们添加到QStackedLayout并设置到主小部件。但是现在我想使用该setCurrentIndex方法使用添加的小部件内的按钮来更改小部件。现在我必须使用该connect功能,但在主小部件类中,我无法从其他小部件访问组件来连接它们。那么我该怎么做呢?

#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;
}
4

2 回答 2

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()));
于 2013-08-27T06:54:17.147 回答
0

来自 Qt 协助

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

因此传递索引是识别小部件需要在特定时间点显示在 StackedLayout 上的关键。假设您的信号名称是在 mainWidget_ 和 createGameWidget_ 中声明的“activated(int)”

所以你需要像这样连接

//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
    }
于 2013-08-27T06:37:44.110 回答