你是否听过一种思路,我会创建一个xxx.ui,我的主进程就是可以加载这个xxx.ui并显示
我指的就是Qt的.ui文件,但是我希望实现一种修改后不需要重新编译运行的效果,就是修改后,我直接打开程序,就可以看到变化,不需要重新编译
可以,Qt 支持这种方式,关键是运行时从外部加载.ui文件。
流程是:
- 用 Qt Designer 修改并保存
xxx.ui。 - 主程序启动时,用
QUiLoader读取这个文件。 - 再次打开程序,就能看到修改后的界面,无须重新编译。
如果你用 C++,核心代码类似这样:
QApplication app(argc, argv); QFile file(QCoreApplication::applicationDirPath() + "/main.ui"); if (!file.open(QIODevice::ReadOnly)) return 1; QUiLoader loader; QWidget *window = loader.load(&file); if (!window) return 1; window->show(); return app.exec();需要区分两种用法:
| 方式 | 修改.ui后是否需要重新编译 |
|---|---|
用uic生成代码,再编译进程序 | 需要 |
用QUiLoader在运行时加载外部.ui | 不需要 |
是的,你实现一下吧,就基于当前ApplicationHost,我不想使用QMainWindow window;了
新代码:
const QString uiPath = QDir(QCoreApplication::applicationDirPath()) .filePath("ui/main.ui"); QFile file(uiPath); if (!file.open(QIODevice::ReadOnly)) { qCritical().noquote() << "Cannot open UI:" << uiPath << file.errorString(); return false; } QUiLoader loader; // UI 中的相对图片路径以 UI 所在目录为基准。 loader.setWorkingDirectory(QFileInfo(file).absoluteDir()); window.reset(loader.load(&file)); if (!window) { qCritical().noquote() << "Cannot load UI:" << uiPath << loader.errorString(); return false; }好了,这一版实现了可以动态读取ui文件的逻辑
Release v1.0.2:支持外部 UI 动态加载 · lianpeiliang/LearnFramework