Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问QStackedWidget中的小部件_C++_Qt - Fatal编程技术网

C++ 访问QStackedWidget中的小部件

C++ 访问QStackedWidget中的小部件,c++,qt,C++,Qt,我正在用QtDesigner开发一个Qt应用程序 以前,访问特定的小部件来处理它们(比如连接信号)非常容易。添加QStackedWidget后,我无法再使用诸如ui->stack->page1->widget之类的东西访问特定的widget 有没有办法做到这一点?或者我应该总是调用findChild方法吗?或者,可能至少可以将堆栈小部件中的一些嵌套小部件分配给主windwo类的属性?QStackedWidget提供了获取的方法,以及 下面是一个简单的例子: MOCed标题 class MyWid

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

以前,访问特定的小部件来处理它们(比如连接信号)非常容易。添加QStackedWidget后,我无法再使用诸如ui->stack->page1->widget之类的东西访问特定的widget


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

QStackedWidget提供了获取的方法,以及

下面是一个简单的例子:

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");    
}
QStackedWidget*stackedWidget=新的QStackedWidget;
stackedWidget->addWidget(新的MyWidget);//索引0
stackedWidget->addWidget(新的QWidget);//指标1
stackedWidget->addWidget(新的MyWidget);//指标2
QVBoxLayout*布局=新的QVBoxLayout;
布局->添加小部件(stackedWidget);
设置布局(布局);
//对第一个小部件的ptr元素执行特定的操作
auto*widget=stackedWidget->widget(0);
auto*mywidget=qobject\u cast(widget);
if(mywidget){
mywidget->ptr->setObjectName(“第一页”);
}

现在,Qt默认使用虚拟接口,所以如果您有需要提取的自定义子部件,可以使用。qobject_cast基本上是一种快速动态_cast,即使没有RTTI也可以工作。在模板驱动的代码中,
dynamic\u cast
有点代码味道:这意味着您过早地丢失了有用的类型信息。对于虚拟接口,情况正好相反:您应该根据需要使用
qobject\u cast

QStackedWidget提供了获取的方法,以及

下面是一个简单的例子:

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");    
}
QStackedWidget*stackedWidget=新的QStackedWidget;
stackedWidget->addWidget(新的MyWidget);//索引0
stackedWidget->addWidget(新的QWidget);//指标1
stackedWidget->addWidget(新的MyWidget);//指标2
QVBoxLayout*布局=新的QVBoxLayout;
布局->添加小部件(stackedWidget);
设置布局(布局);
//对第一个小部件的ptr元素执行特定的操作
auto*widget=stackedWidget->widget(0);
auto*mywidget=qobject\u cast(widget);
if(mywidget){
mywidget->ptr->setObjectName(“第一页”);
}


现在,Qt默认使用虚拟接口,所以如果您有需要提取的自定义子部件,可以使用。qobject_cast基本上是一种快速动态_cast,即使没有RTTI也可以工作。在模板驱动的代码中,
dynamic\u cast
有点代码味道:这意味着您过早地丢失了有用的类型信息。对于虚拟界面,情况正好相反:您应该根据需要使用
qobject\u cast

为什么要一层一层地获取小部件,如果您的小部件是在Qt designer中添加的,您可以通过
ui->widget
直接获取它。

为什么要一层一层地获取小部件,如果您的小部件是在Qt designer中添加的,您可以通过
ui->widget
直接获得它。

QStackedWidget
currentWidget()
widget()
方法,它们似乎非常适合您所描述的内容。@DanielKamilKozar,我无意中写下了答案,没有看到您的评论。如果你想回答,我可以删除我的。@AlexanderHuszagh:好的,祝你投票愉快。:)
QStackedWidget
具有
currentWidget()
widget()
方法,这些方法似乎非常适合您所描述的内容。@DanielKamilKozar,我无意中写下了答案,没有看到您的评论。如果你想回答,我可以删除我的。@AlexanderHuszagh:好的,祝你投票愉快。:)这很清楚,但如果我必须访问小部件(0)中的某个小部件,该怎么办。例如,在designer中,我在堆叠小部件中有一个名为progressBar的小部件页面,我需要访问它。我想做一些类似的事情:ui->stackedWIdget->widget(0)->progressBar@pshemu,更新了我的示例,但这是一个完全不同的问题;但是如果我能做ui->stackedWidget->widget(6)->frame,那就太好了?
findChild
只是在内部调用qobject_cast的等价物(它不直接调用
qobject_cast
,而是使用相同的Qt元对象系统)。如果您已经知道索引,只需手动执行
qobject\u cast
。@pshemu说,虚拟接口不是这样工作的。这不是怎么回事。虚拟接口的全部要点是,它可以使用虚拟重载存储任何类,并仅从基类调用这些专用方法。堆叠小部件只知道基类。然后,您必须将这个基类强制转换为已知类型的派生类型。非常简单,@pshemu,QStackedWidget只知道基类存在(QWidget),它具有派生类中的某些虚拟方法。它通过它们的签名和偏移量知道它们的存在,所以它可以调用它们,但它完全不知道您的派生类。若要强制转换到派生类,必须强制转换
findChild
是一个模板函数,它调用强制转换<代码>qobject_cast是一个强制转换,它强制转换对象。两者都是安全型。您必须强制转换。这很清楚,但如果我必须访问小部件(0)中的某个小部件,该怎么办。例如,在designer中,我在堆叠小部件中有一个名为progressBar的小部件页面,我需要访问它。我想做一些类似的事情:ui->stackedWIdget->widget(0)->progressBar@pshemu,更新了我的示例,但这是一个完全不同的问题;但是如果我能做ui->stackedWidget->widget(6)->frame,那就太好了?
findChild
只是在内部调用qobject\u cast的等价物(它不直接调用
qobject\u cast
,但是