我正在使用QtDesigner开发一个Qt应用程序。
以前,访问特定的小部件非常容易,可以像连接信号一样对它们进行操作。添加QStackedWidget后,我再也无法访问具有类似ui-> stack-> page1->小部件的特定小部件。
有没有办法以某种方式做到这一点?或者我应该总是调用findChild方法吗?或者也许至少可以将堆栈小部件中的一些嵌套小部件分配给主要windwo类的属性?
答案 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
获取。