动态对话框实现也比较容易 , 也是使用 QtDesigner 设计好 用户界面 ,获得 *.ui 文件
但是 此时 不是用 setupUi 来 将设计好的用户界面应用到窗口上 而是 使用 QUiLoader 类 通过 *.ui 文件动态创建一个窗口
这样 , 就可以在程序运行过程中动态的更换窗口界面了
实例代码
1 QApplication a(argc, argv); 2 QUiLoader uiloader; 3 QWidget* dlg = new QWidget; 4 5 QFile file1("mainwindow.ui"); 6 file1.open(QFile::ReadOnly); 7 dlg = uiloader.load(&file1); 8 dlg->show();
这样生成的窗口中 , 要想访问窗口的界面元素 (就是窗口中的子窗口部件) ,就要通过一下手段
QComboBox * primaryColumnCombo = dlg->findChild<QComboBox *>( "primaryColumnCombox");
if(primaryColumnCombo == NULL){
//..........................错误处理....................
}
但是 在 VC6 中 , 由于受编译器的限制 ,QObject::findChild<T> 这个函数不能使用 , 为了解决这个问题
可以调用 qFindChild <T> 这个全局函数 , 用法和 QOBject::findChild<T> 相同
(Qt5 的文档中找不到 qFindChild 这个函数 只能找到一个 qFindChildren 函数 可以尝试用这个函数替换)
注意 : 在编译程序前 在 *.pro 文件中 加入 CONFIG += uitools 这一句
这是因为 QUiLoader 是放在Qt的一个独立库中的 , 要是用这个库就要加上这一句
但是 在 Qt5 中 , 已经不赞成 添加 CONFIG += uitools 了
推荐的做法是 添加 Qt += uitools