QString strPath = QCoreApplication::applicationDirPath() + "/ui/MainWindows.ui";
QFile mainWinFile(strPath);
if(!mainWinFile.exists()) return;
QUiLoader loader;
mainWinFile.open(QFile::ReadOnly);
loader.addPluginPath(QCoreApplication::applicationDirPath());
MainWindows = loader.load(&mainWinFile);
mainWinFile.close();
MainWindows->setWindowFlag(Qt::FramelessWindowHint);
MainWindows->setParent(this);
MainWindows->show();
setWindowFlags(windowFlags()& ~Qt::WindowMaximizeButtonHint);
setFixedSize(MainWindows->width(),MainWindows->height());
m_text=MainWindows->findChild<StaticText*>("staticText");
win下ui文件加载时要同时加载自定义控件的dll动态库。
使用以下函数
loader.addPluginPath(QCoreApplication::applicationDirPath());
关于加载带自定义控件的ui只能加载图像而不能对控件进行操作的原因。
就是因为findChild 找不到对应控件动态库,找不到对应控件就操作就会导致程序异常结束。
我之前在源代码文件下用在lib文件夹放置.a或.lib文件,在include文件夹下放置对应的.h文件。
而生成文件下也将.so文件放置在lib文件夹中,.exe文件夹下也放置了对应的.dll。结果就操作控件指针时就出现程序异常结束问题。
当时我很疑惑ui文件加载dll文件成功了ui界面上也显示了,为什么就是操作不了。
结果问题就在于.exe文件加载的dll是在当前目录,如果再加载lib中的dll就重复了
ui加载的dll文件要和.exe执行文件的依赖同一个路径。
这个就是用惯了linux下Qt用win下的Qt遇到的问题
linux不用在执行文件时下添加.so动态库,只用使用addPluginPath加载的文件夹.so动态库即可。
在linux下带自定义控件的Qt打包除了用linuxdeployqt Test -appimage打包外,还要在lib文件夹下创建一个designer文件夹放置所有控件动态库。