10.6 问题与解答
问:动态加载方式与编译时加载.ui 文件的方式,在原理上有什么不同? 答:从原理上来讲,动态加载方式并不需要通过 uic 把.ui 文件转换成 C++代码,它是程序运行时的时候使用 QUiLoader 类载入该文件的,而编译时加载.ui 文件的方法,是需要借助 uic 把.ui 文件中的内容转化为 C++代码的,并生成 ui_xxx.h 文件。就像下面这种方式:
问:使用动态加载方式时,我如何访问窗体中的各个子窗口部件呢? 答:可以通过调用全局函数 qFindChild<T>()来访问这个窗体中的各个子窗口部件,举例如下:
ui_findButton = qFindChild<QPushButton*>(this, "findButton");
ui_textEdit = qFindChild<QTextEdit*>(this, "textEdit");
ui_lineEdit = qFindChild<QLineEdit*>(this, "lineEdit");
在我们提供的 calculatorbuilder 例子里面有这个函数的具体用法,大家可以参考 ,更为详细的内容请查看 Qt Assistant。
也可以使用 QObject::findChild<T>来访问这个窗体中的各个子窗口部件,举例如下:
QButton *button = myWidget->findChild<
QButton *>( tr(“ok”) );
if (button)
{
...
}
这里的 findChild<T>()函数是一个模板成员函数,它可以返回与给定的名字和类型相匹配的子对象。注意,由于受编译器的制约,它不能在 MS VC6 中使用。