前言

在用Qt做开发时,为了方便快速,一般都使用Qt设计师界面类来做界面相关的布局,这个类在当前工程中是没有.cpp或.h文件的,但主类又有引入了这个头文件,点开转到定义或声明时,是打不开的,如下图:

如果要把整个项目导成dll和lib,就按当前的文件导出,是会报找不到ui_XXX类的路径的。那什么样才能把设计好的.ui界面导成dll和lib呢,看了好多种办法,有真接是用手写代码的方式去而已界面,这样的工作量有点。下面我演示下我觉得可行办法,虽然有些笨,但起码可以调用。

解决方法

1.新建一个工程,包含.ui文件,然后打开.ui文件拖入想要的控件,保存,编译.ui文件。

2.打开当前工程,找到目录下的.ui文件,复制下来,新建一个目录把它放进去。

3.然后去qt安路径下找到uic.exe文件,也把它复制到刚刚放.ui文件的目录下,此时当前目录只有两个文件。


4.按住窗口加R件,输入cmd,进入控件台界面,运行uic xxx.ui -o xxx.h或者uic xxx.ui -o xxx.cpp,在当前目录下就多了一个.h或者.cpp文件,这两个文件只要一个就可以了。

5.新建一个工程,选择类库。

6.把刚才生成的.h文件导入到当前工程,然后打开刚刚生成的源码,我们可以看到整个类的所有属性和成员函数。
.ui文件生成的.h文件

/********************************************************************************
** Form generated from reading UI file 'QtGuiDllDemo.ui'
**
** Created by: Qt User Interface Compiler version 5.7.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef QTGUIDLLDEMO_H
#define QTGUIDLLDEMO_H#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_QtGuiDllDemoClass
{public:QAction *actionOpen;QWidget *centralWidget;QPushButton *pushButton;QPushButton *pushButton_2;QMenuBar *menuBar;QMenu *menu;QToolBar *mainToolBar;QStatusBar *statusBar;void setupUi(QMainWindow *QtGuiDllDemoClass){if (QtGuiDllDemoClass->objectName().isEmpty())QtGuiDllDemoClass->setObjectName(QStringLiteral("QtGuiDllDemoClass"));QtGuiDllDemoClass->resize(1046, 786);actionOpen = new QAction(QtGuiDllDemoClass);actionOpen->setObjectName(QStringLiteral("actionOpen"));centralWidget = new QWidget(QtGuiDllDemoClass);centralWidget->setObjectName(QStringLiteral("centralWidget"));pushButton = new QPushButton(centralWidget);pushButton->setObjectName(QStringLiteral("pushButton"));pushButton->setGeometry(QRect(330, 210, 231, 111));pushButton_2 = new QPushButton(centralWidget);pushButton_2->setObjectName(QStringLiteral("pushButton_2"));pushButton_2->setGeometry(QRect(400, 430, 231, 81));QtGuiDllDemoClass->setCentralWidget(centralWidget);menuBar = new QMenuBar(QtGuiDllDemoClass);menuBar->setObjectName(QStringLiteral("menuBar"));menuBar->setGeometry(QRect(0, 0, 1046, 23));menu = new QMenu(menuBar);menu->setObjectName(QStringLiteral("menu"));QtGuiDllDemoClass->setMenuBar(menuBar);mainToolBar = new QToolBar(QtGuiDllDemoClass);mainToolBar->setObjectName(QStringLiteral("mainToolBar"));QtGuiDllDemoClass->addToolBar(Qt::TopToolBarArea, mainToolBar);statusBar = new QStatusBar(QtGuiDllDemoClass);statusBar->setObjectName(QStringLiteral("statusBar"));QtGuiDllDemoClass->setStatusBar(statusBar);menuBar->addAction(menu->menuAction());menu->addAction(actionOpen);retranslateUi(QtGuiDllDemoClass);QMetaObject::connectSlotsByName(QtGuiDllDemoClass);} // setupUivoid retranslateUi(QMainWindow *QtGuiDllDemoClass){QtGuiDllDemoClass->setWindowTitle(QApplication::translate("QtGuiDllDemoClass", "QtGuiDllDemo", Q_NULLPTR));actionOpen->setText(QApplication::translate("QtGuiDllDemoClass", "open", Q_NULLPTR));pushButton->setText(QApplication::translate("QtGuiDllDemoClass", "\346\216\247\344\273\266", Q_NULLPTR));pushButton_2->setText(QApplication::translate("QtGuiDllDemoClass", "\347\225\214\351\235\242", Q_NULLPTR));menu->setTitle(QApplication::translate("QtGuiDllDemoClass", "\346\226\207\344\273\266", Q_NULLPTR));} // retranslateUi};namespace Ui {class QtGuiDllDemoClass: public Ui_QtGuiDllDemoClass {};
} // namespace UiQT_END_NAMESPACE
#endif // QTGUIDLLDEMO_H

7.按qt给的格式把.h更改之后加到当前类的下面。
在当前工程的类加了ui类的.h文件

#pragma once#include "guidlltest_global.h"
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>class GUIDLLTEST_EXPORT GuiDllTest
{public:GuiDllTest();
};QT_BEGIN_NAMESPACEclass GUIDLLTEST_EXPORT Ui_QtGuiDllDemoClass
{public:QAction *actionOpen;QWidget *centralWidget;QPushButton *pushButton;QPushButton *pushButton_2;QMenuBar *menuBar;QMenu *menu;QToolBar *mainToolBar;QStatusBar *statusBar;void setupUi(QMainWindow *QtGuiDllDemoClass);void retranslateUi(QMainWindow *QtGuiDllDemoClass);};namespace Ui {class QtGuiDllDemoClass : public Ui_QtGuiDllDemoClass {};
} // namespace UiQT_END_NAMESPACE

加了ui类的.cpp文件

#include "GuiDllTest.h"GuiDllTest::GuiDllTest()
{}void Ui_QtGuiDllDemoClass::setupUi(QMainWindow *QtGuiDllDemoClass)
{if (QtGuiDllDemoClass->objectName().isEmpty())QtGuiDllDemoClass->setObjectName(QStringLiteral("QtGuiDllDemoClass"));QtGuiDllDemoClass->resize(1046, 786);actionOpen = new QAction(QtGuiDllDemoClass);actionOpen->setObjectName(QStringLiteral("actionOpen"));centralWidget = new QWidget(QtGuiDllDemoClass);centralWidget->setObjectName(QStringLiteral("centralWidget"));pushButton = new QPushButton(centralWidget);pushButton->setObjectName(QStringLiteral("pushButton"));pushButton->setGeometry(QRect(330, 210, 231, 111));pushButton_2 = new QPushButton(centralWidget);pushButton_2->setObjectName(QStringLiteral("pushButton_2"));pushButton_2->setGeometry(QRect(400, 430, 231, 81));QtGuiDllDemoClass->setCentralWidget(centralWidget);menuBar = new QMenuBar(QtGuiDllDemoClass);menuBar->setObjectName(QStringLiteral("menuBar"));menuBar->setGeometry(QRect(0, 0, 1046, 23));menu = new QMenu(menuBar);menu->setObjectName(QStringLiteral("menu"));QtGuiDllDemoClass->setMenuBar(menuBar);mainToolBar = new QToolBar(QtGuiDllDemoClass);mainToolBar->setObjectName(QStringLiteral("mainToolBar"));QtGuiDllDemoClass->addToolBar(Qt::TopToolBarArea, mainToolBar);statusBar = new QStatusBar(QtGuiDllDemoClass);statusBar->setObjectName(QStringLiteral("statusBar"));QtGuiDllDemoClass->setStatusBar(statusBar);menuBar->addAction(menu->menuAction());menu->addAction(actionOpen);retranslateUi(QtGuiDllDemoClass);QMetaObject::connectSlotsByName(QtGuiDllDemoClass);
} // setupUivoid Ui_QtGuiDllDemoClass::retranslateUi(QMainWindow *QtGuiDllDemoClass)
{QtGuiDllDemoClass->setWindowTitle(QApplication::translate("QtGuiDllDemoClass", "QtGuiDllDemo", Q_NULLPTR));actionOpen->setText(QApplication::translate("QtGuiDllDemoClass", "open", Q_NULLPTR));pushButton->setText(QApplication::translate("QtGuiDllDemoClass", "\346\216\247\344\273\266", Q_NULLPTR));pushButton_2->setText(QApplication::translate("QtGuiDllDemoClass", "\347\225\214\351\235\242", Q_NULLPTR));menu->setTitle(QApplication::translate("QtGuiDllDemoClass", "\346\226\207\344\273\266", Q_NULLPTR));
} // retranslateUi

8.重新生成解决方案,就在当前目录下生成一个dll文件和lib文件,按正常类调用就可以了。

把Qt的界面文件(.ui文件)生成源文件(.h或.cpp)封装成链接库相关推荐

  1. Python 中 PyQt5 + pycharm 调用 Qt Designer,将.ui文件转换成 .py 文件

    From:https://blog.csdn.net/qq_40666028/article/details/81069878 基于Qt Designer 和 pyuic 开发 UI 界面的方法:ht ...

  2. QT入门学习之UI文件设计与运行机制

    在Qt Creatrer中新建一个Qt Widget Application项目demo1,其基类选择QWidget作为窗体基类,并选择"Generrate form"复选框,让其 ...

  3. vs2019中打开qt中的后缀.ui文件提示未能完成操作,未指定的错误

    参考博客:https://blog.csdn.net/qq_36651243/article/details/114632244 总是会出现如下的错误:打开.ui文件的时候 参考上述大神博客,我采用的 ...

  4. 将h.264视频流封装成flv格式文件(一.flv格式)

    原帖地址:http://blog.csdn.net/yeyumin89/article/details/7932368 原帖虽然贵为好贴,看感觉看起来有点乱,没有层次感,贴过来,修改下格式,阅读起来方 ...

  5. 【两步】快速将Qt Designer设计的*.ui文件转成 ui_*.h文件

    网上流传的uic的做法,然而麻烦,不如直接保存快捷. 第一步:建立 *.ui 第二步:生成代码并保存为 ui_*.h

  6. 将h.264视频流封装成flv格式文件

    https://blog.csdn.net/leixiaohua1020/article/details/84519384 https://blog.csdn.net/xin_hua_3/articl ...

  7. qt ui界面加入qsplitter_UI 文件设计与运行机制

    上一篇通过一个 "Hello World" 实例,演示了在 Qt Creator 里创建应用程序.设计窗体界面.编译和运行程序的基本过程.这一篇将介绍可视化设计的 UI 界面文件的 ...

  8. python界面设计资源库_python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法...

    PyQt5 Qt Designer (Qt设计师) PyQt5是对Qt所有类进行封装, Qt能开发的东西, PyQt都能开发. Qt是强大的GUI库之一, 用C++开发, 并且跨平台. PyQt双许可 ...

  9. Qt探秘——谈ui文件的用法

    相信用过Qt Designer的朋友,对Qt Project中的.ui文件并不陌生.这个文件在Qt Designer中并不能直接修改其源代码,而只能通过Qt Designer的图形工具对其进行操作.对 ...

最新文章

  1. largest number java_将给定的数组组成最大的数 Largest Number
  2. leetcode算法题--连续差相同的数字
  3. sql语句字符串处理大全
  4. android 应用状态,保持应用程序状态在Android上
  5. 学Java好还是学Python好?这里有些建议
  6. SQL2008学习小结
  7. 记一起因证书引发的支付宝支付异步通知接收不到的事故
  8. 向shell脚本中传入参数
  9. 1.10 长短期记忆(LSTM)
  10. MySQL中的执行计划(explain)
  11. C++ 对象没有显式初始化
  12. 设计一个三阶巴特沃斯滤波器_巴特沃斯低通滤波器设计分析.doc
  13. Matlab:拉盖尔高斯光束的干涉
  14. python 两点曲线_ECC椭圆曲线加密算法:ECDH 和 ECDSA
  15. 专访程炳皓:八年一觉“开心”梦
  16. 【笔记整理】node.js笔记
  17. ubuntu14.04下安装图片编辑软件pinta
  18. 教你如何在快应用中跳转到Android的app
  19. 小学生日常行为规范PPT模板
  20. LIMS实验室信息管理系统帮助实验室解决实验室管理的问题

热门文章

  1. python 多进程绑定端口_Python教程之创建多进程
  2. java 文件字节流_Java:文件字符流和字节流的输入和输出
  3. 机器视觉资料汇总(2)
  4. LaTeX输入单个点、横向多个点、竖向多个点、斜向多个点
  5. 程序员要学会读源代码
  6. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC
  7. 程序员面试题精选100题(38)-输出1到最大的N位数[算法]
  8. 自增符号++(自减符号--)带来的部分影响
  9. 【OpenCV3】Opencv3.2.0在Hisi3521下的交叉编译和移植
  10. RediSQL 0.8.0 发布,将查询结果写入流中