Qt自定义控件
- 开发系统:ubuntu22.04
- IDE:clion
- 构建工具:cmake
Qt自定义控件之插件形式
插件形式是指将自定义控件按照一定的规则,生成动态库,放到Qt designer插件加载目录/usr/lib/x86_64-linux-gnu/qt5/plugins/designer
下,Qt designer启动时加载,自定义控件就像内置控件一样可以直接拖拽。这样可以做到自定义控件全局可用。
下面是效果图:
自定义控件依赖QDesignerCustomWidgetInterface
类,使用此类需要安装qttools5-dev
。
sudo apt install qttools5-dev
一个简单示例
下面以一个自定义的Label来介绍,为了简单起见,这个Label相对于QLabel只是可以设置默认的字体颜色(原本的QLabel就可以)。
首先写一个如下cmake,用于动态库的编译
cmake_minimum_required(VERSION 3.28) project(MyLabel) set(CMAKE_CXX_STANDARD 17) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt5 COMPONENTS Core Gui Widgets Designer REQUIRED) include_directories(${PROJECT_SOURCE_DIR}) aux_source_directory(${PROJECT_SOURCE_DIR} SRCS) file(GLOB QRCS "*.qrc") add_library(MyLabel SHARED ${SRCS} ${QRCS}) target_link_libraries(MyLabel Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Designer)
定义MyLabel类: mylabel.h
#ifndef MYLABEL_H #define MYLABEL_H #include <QLabel> class MyLabel : public QLabel { Q_OBJECT Q_PROPERTY(QColor color READ textColor WRITE setTextColor) public: MyLabel(QWidget *parent = nullptr); ~MyLabel(); void setTextColor(const QColor &c); QColor textColor() const; private: QColor color; }; #endif //MYLABEL_H
mylabel.cpp
#include "mylabel.h" MyLabel::MyLabel(QWidget *parent) : QLabel(parent) { color = QColor(Qt::black); setPalette(QPalette(color)); } MyLabel::~MyLabel() { } void MyLabel::setTextColor(const QColor &c) { color = c; setPalette(QPalette(color)); } QColor MyLabel::textColor() const { return color; }
定义MyLabel 插件类:mylabelplugin.h
#ifndef MYLABELPLUGIN_H #define MYLABELPLUGIN_H #include <QtUiPlugin/QDesignerCustomWidgetInterface> class MyLabelPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_PLUGIN_METADATA(IID QDesignerCustomWidgetInterface_iid) Q_INTERFACES(QDesignerCustomWidgetInterface) public: MyLabelPlugin(QObject *parent = nullptr); QString name() const; QString includeFile() const; QString group() const; QIcon icon() const; QString toolTip() const; QString whatsThis() const; bool isContainer() const; QWidget *createWidget(QWidget *parent); }; #endif //MYLABELPLUGIN_H
mylabelplugin.cpp
#include "mylabelplugin.h" #include "mylabel.h" MyLabelPlugin::MyLabelPlugin(QObject *parent) { } QString MyLabelPlugin::name() const { return "MyLabel"; } QString MyLabelPlugin::includeFile() const { return "mylabel.h"; } QString MyLabelPlugin::group() const { return tr("Custom Widgets"); } QIcon MyLabelPlugin::icon() const { return QIcon(":/images/mylabel.png"); } QString MyLabelPlugin::toolTip() const { return tr("An custom label widget"); } QString MyLabelPlugin::whatsThis() const { return tr("balabala balabala."); } bool MyLabelPlugin::isContainer() const { return false; } QWidget *MyLabelPlugin::createWidget(QWidget *parent) { return new MyLabel(parent); }
还未解决头文件包含问题,库的链接问题
分类:
QT
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2023-07-26 bash变量冒号扩展