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

时间:2014-07-23 23:14:28

标签: c++ qt

我是QT的新手,使用QUiLoader Class时遇到了麻烦。我想要实现的是在同一个窗口中点击一个按钮加载另一个ui文件,这是正常的。但是加载的新ui文件中有一个按钮,当点击它时应该执行某个代码(比如print" 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 个答案:

答案 0 :(得分:0)

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

按插槽名称

自动连接

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

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

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

警告:文档没有说,我没有检查源,所以如果多次调用,可能会重复连接。所以请注意这一点,如果这会打击你,那么你必须使用下面的方法:

手动连接

如果您有不同的插槽名称或想要连接到父级以外的其他人,您也可以使用QObject::findChild自行建立连接:

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