10.6 问题与解答

问:动态加载方式与编译时加载.ui 文件的方式,在原理上有什么不同? 答:从原理上来讲,动态加载方式并不需要通过 uic 把.ui 文件转换成 C++代码,它是程序运行时的时候使用 QUiLoader 类载入该文件的,而编译时加载.ui 文件的方法,是需要借助 uic 把.ui 文件中的内容转化为 C++代码的,并生成 ui_xxx.h 文件。就像下面这种方式:

问:使用动态加载方式时,我如何访问窗体中的各个子窗口部件呢? 答:可以通过调用全局函数 qFindChild<T>()来访问这个窗体中的各个子窗口部件,举例如下:

ui_findButton = qFindChild&lt;QPushButton*&gt;(this, "findButton");
ui_textEdit = qFindChild&lt;QTextEdit*&gt;(this, "textEdit");
ui_lineEdit = qFindChild&lt;QLineEdit*&gt;(this, "lineEdit");

在我们提供的 calculatorbuilder 例子里面有这个函数的具体用法,大家可以参考 ,更为详细的内容请查看 Qt Assistant。

也可以使用 QObject::findChild<T>来访问这个窗体中的各个子窗口部件,举例如下:

QButton *button = myWidget-&gt;findChild&lt; 
QButton *&gt;( tr(“ok”) );
if (button)
{
    ...
}

这里的 findChild<T>()函数是一个模板成员函数,它可以返回与给定的名字和类型相匹配的子对象。注意,由于受编译器的制约,它不能在 MS VC6 中使用。