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);
}