简体   繁体   中英

Accessing widgets inside QStackedWidget

I am developing a Qt app with QtDesigner.

Previously it was quite easy to access specific widgets to do something with them like connecting signals. After I added QStackedWidget I can no longer access specific widgets with something like ui->stack->page1->widget.

Is there a way to do it somehow? Or should I always call findChild method? Or maybe it is possible to at least assign some of the nested widgets in stack widget to properties of the main windwo class?

QStackedWidget provides a method to get child widgets by index , as well as the current widget .

A quick example is as follows:

MOCed Header

class MyWidget: QWidget
{
    Q_OBJECT

public:
    using QWidget::QWidget

    QWidget *ptr;
};

Source File

QStackedWidget *stackedWidget = new QStackedWidget;
stackedWidget->addWidget(new MyWidget);     // index 0
stackedWidget->addWidget(new QWidget);      // index 1
stackedWidget->addWidget(new MyWidget);     // index 2

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(stackedWidget);
setLayout(layout);

// do something specific with the first widget's ptr element
auto* widget = stackedWidget->widget(0);
auto* mywidget = qobject_cast<MyWidget*>(widget);
if (mywidget) {
    mywidget->ptr->setObjectName("FirstPage");    
}

Now, Qt uses virtual interfaces by default, so if you have a custom subwidget you need to extract, you can use qobject_cast . qobject_cast is basically a fast dynamic_cast, and works even without RTTI. In template-driven code, dynamic_cast is a bit of a code-smell: it means you lost useful type information too early. With virtual interfaces, the exact opposite is true: you should use qobject_cast as needed.

为什么要逐层获取窗口小部件,如果在Qt设计器中添加了窗口小部件,则可以直接通过ui->widget来获取。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM