qt modules public internal 私有头文件 private

qt对源码进行了分层,把数据成员都单独拉到一个*_p.h的头文件中,形成internal部分的接口类
Qt之二进制兼容  
qt _p.h 文件的用途是什么 
qt不建议用户使用internal部分的接口类,因为不同平台和不用版本的qt,internal部分的实现可能有差异,调用internla部分的接口类在跨平台或跨版本使用时可能会导致崩溃。

要启用模块(module)internal部分的头文件,将相应依赖项添加到pro,下面是达到这个目的的两种方案。

比如启用widgets的internal部分的头文件(假设原本QT的值为core gui widgets)

方式1: 直接在pro文件中加入​​​下面代码来达到目的。

INCLUDEPATH +=D:\Qt\Qt5.12.0\5.12.0\msvc2015_64/include/QtCore \
    D:\Qt\Qt5.12.0\5.12.0\msvc2015_64/include/QtCore/$$QT_VERSION D:\Qt\Qt5.12.0\5.12.0\msvc2015_64/include/QtCore/$$QT_VERSION/QtCore

方式2:QT += widgets-private

该语句意义就是在原有工程生成的Makefiled的INCLUDE项添加private部分的头文件。
可以用beyond compare对比添加前与添加后生成的的Mafile.Debug中的内容,以理解加与不加的区别。


这是添加widgets-private之后INCLUDE中多出来的项

-ID:\Qt\Qt5.12.0\5.12.0\msvc2015_64\include\QtWidgets\5.12.0 
-ID:\Qt\Qt5.12.0\5.12.0\msvc2015_64\include\QtWidgets\5.12.0\QtWidgets 
-ID:\Qt\Qt5.12.0\5.12.0\msvc2015_64\include\QtGui\5.12.0 
-ID:\Qt\Qt5.12.0\5.12.0\msvc2015_64\include\QtGui\5.12.0\QtGui 
-ID:\Qt\Qt5.12.0\5.12.0\msvc2015_64\include\QtCore\5.12.0 
-ID:\Qt\Qt5.12.0\5.12.0\msvc2015_64\include\QtCore\5.12.0\QtCore 

之后就可以在自己的工程中加入所需要的私有头文件,并调用私有头文件中定义的函数了

//E:\workspace\QtWork\moc\generator.cpp
.......
#include <private/qmetaobject_p.h> //for the flags.
#include <private/qplugin_p.h> //for the flags.
......

Qt 6 中的 Qt Extras 模块_feiyangqingyun的博客-CSDN博客 
Qt自带未公开的属性_风起时~微凉的博客-CSDN博客_gui-private

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Qt中使用CANopennode的头文件,你需要完成以下几个步骤: 1. 下载CANopennode的源代码,并将其放置在一个合适的位置。 2. 在Qt中创建一个新的项目。 3. 在Qt项目中添加一个新的源文件,并将其命名为“CANopennodeWrapper.cpp”。 4. 在CANopennodeWrapper.cpp文件中包含CANopennode的头文件。例如,如果你的CANopennode源代码位于“C:\CANopennode”目录下,则可以使用以下代码包含头文件: ```c++ #include "C:\CANopennode\canopen.h" ``` 5. 在CANopennodeWrapper.cpp文件中编写包装器函数,将CANopennode的函数调用包装在Qt的信号和槽机制中。例如,你可以编写以下函数,该函数调用CANopennode的canOpen函数,并发出一个信号来通知Qt应用程序: ```c++ void CANopennodeWrapper::openCAN(int node_id, int bitrate) { int rv = canOpen(node_id, bitrate); emit canOpened(rv); } ``` 6. 在Qt项目中创建一个新的类,并将其命名为“CANopennodeWrapper”。 7. 在CANopennodeWrapper类中声明一个信号,该信号将在CANopennodeWrapper.cpp文件中包装器函数中发出。例如: ```c++ class CANopennodeWrapper : public QObject { Q_OBJECT public: CANopennodeWrapper(QObject *parent = nullptr) : QObject(parent) {} signals: void canOpened(int rv); }; ``` 8. 在Qt应用程序中使用CANopennodeWrapper类的实例来调用CANopennode的函数并处理信号。例如: ```c++ CANopennodeWrapper *wrapper = new CANopennodeWrapper(this); connect(wrapper, &CANopennodeWrapper::canOpened, [=](int rv){ if(rv == 0) { qDebug() << "CANopen connection opened successfully."; } else { qDebug() << "Failed to open CANopen connection."; } }); wrapper->openCAN(1, 125000); ``` 这样,你就可以在Qt应用程序中使用CANopennode的头文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值