QT源码阅读--QObject

本文详细解析了QT框架中的句柄实体模式实现原理。通过分析QObject类与其私有数据类QObjectData之间的关系,介绍了句柄实体模式的具体应用。同时,文中还解释了Q_D和Q_Q宏的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • QObject 是QT类体系中唯一的基类,大小如下:
    qDebug()<<sizeof(QObject);
    结果为:8
    
    class Q_CORE_EXPORT QObject
    {
        Q_OBJECT
        ...
    protected:
       <span style="color:#ff0000;"> QScopedPointer<QObjectData> d_ptr;</span>
    }
    在QObject类中定义了一个QObjectData 类的指针 d_ptr,我理解为数据类指针。
  • 在QObject 类的定义上面,还有一个QObjectData类,这个类里面封装类数据,而QObject类封装了句柄,这就是所谓的句柄实体模式,我就理解他为句柄--数据分离。
    看到代码中有这么一处
    
    QObjectData {
    public:
        virtual ~QObjectData() = 0;
       <span style="color:#ff0000;"> QObject *q_ptr;</span>
        QObject *parent;
        QObjectList children;
    <span style="white-space:pre">	</span>....
    }
    在QObjectData类中定义了一个QObject 类的指针 q_ptr,我理解为句柄指针。这和上面的d_ptr 结合在一起看,可以得出,这2个类可以相互引用。
  • Q_D和Q_Q
    
    #define Q_D(Class) Class##Private * const <span style="color:#ff0000;">d</span> = d_func()
    #define Q_Q(Class) Class * const <span style="color:#ff0000;">q </span>= q_func()
    我在看QT源码时,发现有非常多的Q_D和Q_Q,之前不知道是什么意思,现在大概了解了,Q_D(xxxClass)表示可以得到xxxClass的数据类,
    Q_Q(xxxClass)表示可以得到xxxClass的接口类。
  • 
    
    
### 关于 Qt 6.6.3 中 `libfcitxplatforminputcontextplugin-qt6.so` 插件的信息 #### 插件概述 `libfcitxplatforminputcontextplugin-qt6.so` 是用于集成 Fcitx 输入法框架到 Qt 应用程序中的插件。Fcitx 是一种流行的输入法框架,在亚洲地区广泛使用,特别是在支持中文、日文和其他复杂字符集方面表现出色。 此插件允许应用程序通过 Qt 的平台抽象层 (QPA) 使用 Fcitx 提供的输入方法功能[^1]。 #### 安装与配置 为了使该插件正常工作,通常需要确保安装了相应的开发包以及运行库。对于基于 Debian 或 Ubuntu 的 Linux 发行版,可以通过以下命令来安装必要的依赖项: ```bash sudo apt-get update && sudo apt-get install fcitx-libs-dev qtbase5-private-dev ``` 如果构建自定义版本的 Qt,则可能需要在配置阶段指定额外选项以启用对 Fcitx 支持。例如: ```bash ./configure -prefix /opt/qt6.6.3 -qt-xcb -icu -system-freetype -fontconfig \ -glib -accessibility -openssl-linked -sql-mysql -sql-psql \ -qtmultimedia -qttools -qttranslations -qtdeclarative \ -feature-inputmethods -I/usr/include/fcitx -L/usr/lib/x86_64-linux-gnu/ make -j$(nproc) sudo make install ``` 上述命令假设系统已经预先安装好了 Fcitx 及其相关头文件和链接库[^2]。 #### 常见问题排查 当遇到类似于 `qt.qpa.plugin: Could not find the Qt platform plugin "dxcb"` 这样的错误消息时,这表明环境变量设置不正确或者缺少某些必需组件。针对 `libfcitxplatforminputcontextplugin-qt6.so` 插件的具体情况,可以尝试以下几个解决方案: - **检查路径**: 确认 `$QT_PLUGIN_PATH` 和其他相关环境变量指向正确的目录。 - **验证存在性**: 验证目标机器上确实存在 `libfcitxplatforminputcontextplugin-qt6.so` 文件,并且位于预期位置。 - **权限问题**: 检查是否有足够的读取权限访问这些共享对象文件及其所在目录。 - **兼容性确认**: 如果是从源码编译而来,请保证所使用的工具链版本与其他依赖一致,避免 ABI 不匹配引起的问题。 #### 示例代码片段展示如何加载并初始化插件 下面是一个简单的 C++ 例子演示怎样手动加载这个特定的输入上下文插件: ```cpp #include <QApplication> #include <QPlatformInputContextPlugin> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 显式创建 Fcitx 平台输入上下文实例 QPlatformInputContextPlugin* inputContextFactory = new QPlatformInputContextPlugin("fcitx", QStringList(), nullptr); QObject::connect(inputContextFactory, &QPlatformInputContextPlugin::availableChanged, [&]() { qDebug() << "FCITX Input Context Available!"; }); return app.exec(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值