如何在qt中使用QuiLoader加载ui文件的类文件

How to load class file of the ui file loaded using QuiLoader in qt

本文关键字:文件 ui 加载 QuiLoader qt      更新时间:2023-10-16

我是QT的新手,在使用QUiLoader类时遇到了麻烦。我想要实现的是加载另一个ui文件上的按钮单击在同一窗口,这是工作良好。但是加载的新ui文件中有一个按钮,当点击时应该执行特定的代码(比如打印"hi"),这并没有发生。按钮出现了,但什么也没做。新加载的仪表板的类文件。UI文件未被包含。

下面是加载新ui文件的代码
QUiLoader loader;
QFile file(":/dashboard.ui");
file.open(QFile::ReadOnly);
QWidget *myWidget = loader.load(&file, this);
qDebug() << loader.pluginPaths();
file.close();
ui->verticalLayout->addWidget(myWidget);

有一种方法,通过它我可以包括仪表板的类文件。UI使按钮再次完美地工作?

您需要连接信号,该代码(显然)不会自动完成。有两种方法可以做到。注意:未经测试的代码,可能有错误。

按槽位名自动连接

如果在父类中有正确名称的方法,可以使用QMetaObject::connectSlotsByName:

...
ui->verticalLayout->addWidget(myWidget); // first myWidget must have parent set
QMetaObject::connectSlotsByName(this); // connect matching signals from children
...

假设按钮名称为,例如"myLoadedButton",并且您想要clicked()信号,那么使用上述代码,您必须在this对象的类中具有on_myLoadedButton_clicked()插槽。

警告:文档没有说明并且我没有检查源代码,所以如果多次调用这个可能会重复连接。所以要小心这个,如果它击中了你,那么你必须使用下面的方法:

手动连接

如果您有不同的插槽名称或想要连接到父节点以外的其他节点,您也可以使用QObject::findChild:

自己进行连接。
...
QPushButton *button = myWidget->findChild<QPushButton *>("myLoadedButton");
if (button) {
   QObject::connect(button, SIGNAL(clicked()), this, SLOT(loadedButtonPress()));
} 
// else widget not found, print error?