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

Posted

技术标签:

【中文标题】如何在qt中加载使用QuiLoader加载的ui文件的类文件【英文标题】:How to load class file of the ui file loaded using QuiLoader in qt 【发布时间】:2014-07-23 23:14:27 【问题描述】:

我是 QT 新手,在使用 QUiLoader 类时遇到了麻烦。我想要实现的是在同一个窗口中单击按钮加载另一个 ui 文件,这工作正常。但是加载的新 ui 文件中有一个按钮,单击该按钮时应该执行某个代码(比如打印“hi”),但它不会以某种方式发生。该按钮出现但什么也不做。不知何故,新加载的dashboard.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);

有没有办法可以包含dashboard.ui的类文件,以便按钮再次完美工作?

【问题讨论】:

【参考方案1】:

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

按插槽名称自动连接

如果你的父类中有正确名字的方法,你可以使用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?

【讨论】:

非常感谢,这真的很有帮助

以上是关于如何在qt中加载使用QuiLoader加载的ui文件的类文件的主要内容,如果未能解决你的问题,请参考以下文章

如果在派生的 QWidget 中加载 QUiLoader 小部件不显示

如何在 QT 中加载 UI 表单?

如何在 Qt 中从 txt 文件中加载大数据

在 Qt GUI 中加载和显示图像

如何配置 Qt Designer 以在 OSX 中加载 PyQt 小部件?

在 Qt Creator 中加载具有相对路径的文件