访问QStackedWidget中的小部件

时间:2017-07-07 22:13:04

标签: c++ qt

我正在使用QtDesigner开发一个Qt应用程序。

以前,访问特定的小部件非常容易,可以像连接信号一样对它们进行操作。添加QStackedWidget后,我再也无法访问具有类似ui-> stack-> page1->小部件的特定小部件。

有没有办法以某种方式做到这一点?或者我应该总是调用findChild方法吗?或者也许至少可以将堆栈小部件中的一些嵌套小部件分配给主要windwo类的属性?

2 个答案:

答案 0 :(得分:2)

QStackedWidget提供了一种获取child widgets by index的方法,以及current widget

一个简单的例子如下:

MOCed标头

class MyWidget: QWidget
{
    Q_OBJECT

public:
    using QWidget::QWidget

    QWidget *ptr;
};

源文件

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");    
}

现在,Qt默认使用虚拟接口,因此如果您需要提取自定义子窗口小部件,则可以使用qobject_cast。 qobject_cast基本上是一个快速的dynamic_cast,即使没有RTTI也可以工作。在模板驱动的代码中,dynamic_cast有点代码味道:它意味着您过早地丢失了有用的类型信息。使用虚拟接口时,情况恰恰相反:您应该根据需要使用qobject_cast

答案 1 :(得分:0)

为什么逐层获取小部件,如果您的小部件已添加到Qt设计器中,则可以直接通过ui->widget获取。