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