我正在用QtDesigner开发一个Qt应用程序。
以前,很容易访问特定的小部件来使用它们来做一些事情,比如连接信号。添加QStackedWidget后,我不能再使用类似ui->stack->page1->widget的方式访问特定的小部件。
有没有办法做到这一点呢?或者我应该总是调用findChild方法?或者至少可以将堆栈小部件中的一些嵌套小部件分配给主windwo类的属性?
发布于 2017-07-08 06:18:17
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。
发布于 2017-07-12 19:05:39
为什么你一层一层的获取小部件,如果你的小部件是在Qt designer中添加的,你可以通过ui->widget直接获取。
https://stackoverflow.com/questions/44980383
复制相似问题