在Qt设计师(Qt Designer )控件面板加入自定义控件

目录

1. 问题的提出

2. 本次开发环境说明

3. 具体实现

4. 注意的问题

5. 参考链接


1. 问题的提出

        在Qt开发中,经常利用Qt设计师(Qt Designer )把界面设计好,将界面放到ui文件中,将逻辑处理放到cpp文件中,这样可以做到界面和逻辑分离,便于维护和分工,如:让界面设计人员做界面,让开发人员实现逻辑。

      Qt Designer提供功能常用的控件,如:编辑框、文本控件、组框等等,但有时还是不存在满足自己业务特定需求的控件,这时就需要自己开发,并插入到Qt Designer控件面板。如何在Qt Designer控件面板实现插入自定义的控件呢?

2. 本次开发环境说明

  • Ubuntu 18.0.4。
  • Qt 5.14.1。
  • QtCreator 4.11.0。

3. 具体实现

      如图选择‘其他项目’中的‘Qt设计师自定义控件’然后选择‘Choose’(也可双击‘Qt设计师自定义控件’选项)

   在框选位置输入项目名称,然后点击‘下一步’

    注意:构建套件的版本类型需要与下图中‘帮助’列表中‘About Qt Creator’弹窗的信息版本一致

然后选择对应版本的构建套件下一步即可

双击“<新类>”节点,更改控件类名,右侧会根据控件类生成相关的文件(如果需要项目包含源码默认勾选内容即可),选择完成后,可直接点击‘下一步’到最后点击‘完成’

然后一直单击“下一步”直到完成。 完成后再从QWidget派生的子类的cpp和.h文件中添加如下代码:

#ifndef ARROWPLUGIN_H
#define ARROWPLUGIN_H

#include <QWidget>

class arrowPlugin : public QWidget
{
    Q_OBJECT

public:
    
    Q_PROPERTY(QColor brushcolor READ brushColor WRITE setBrushColor)
    Q_PROPERTY(QColor pencolor READ pencolor WRITE setPenColor)
    Q_PROPERTY(int penwidth READ penWidth WRITE setPenWidth)

public:
    explicit arrowPlugin(QWidget *parent = nullptr);
    ~arrowPlugin();
public:

    QColor pencolor() const;
    void setPenColor(const QColor&clr);
 
    QColor brushColor() const;
    void setBrushColor(const QColor&clr);

    int penWidth() const;
    void setPenWidth(int nWidth);

private:

    virtual void paintEvent(QPaintEvent *event) override;
 private:

    int m_nPenWidth{1};
    QColor m_penColor{Qt::black};
    QColor m_brushColor{Qt::white};
    QPen* m_pPen{nullptr};
    QBrush* m_pBrush{nullptr};
};

#endif // ARROWPLUGIN_H
#include "arrowplugin.h"
#include<QPainter>
arrowPlugin::arrowPlugin(QWidget *parent) :
    QWidget(parent)
{
    setPenWidth(1);
    setPenColor(Qt::black);
    setBrushColor(Qt::white);

}

arrowPlugin::~arrowPlugin()
{
    delete  m_pPen;
    delete  m_pBrush;
}

QColor arrowPlugin::pencolor() const
{
    return m_penColor;
}

void arrowPlugin::setPenColor(const QColor&clr)
{
    m_penColor = clr;
    if(nullptr == m_pPen)
    {
        m_pPen = new QPen();
    }

    m_pPen->setColor(clr);

    update();
}

QColor arrowPlugin::brushColor() const
{
    return m_brushColor;
}

void arrowPlugin::setBrushColor(const QColor&clr)
{
    m_brushColor = clr;

    if(nullptr == m_pBrush)
    {
        m_pBrush = new QBrush;
    }

     m_pBrush->setColor(m_brushColor);

     update();
}

int arrowPlugin::penWidth() const
{
    return m_nPenWidth;
}
void arrowPlugin::setPenWidth(int nWidth)
{
    m_nPenWidth = nWidth;

    if(nullptr == m_pPen)
    {
        m_pPen = new QPen();
    }

     m_pPen->setWidth(m_nPenWidth);

     update();
}

void arrowPlugin::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(*m_pPen);
    painter.setBrush(*m_pBrush);

    auto twicePenWidth = 2 * m_nPenWidth;

    // 减去2倍画笔宽,是为了防止画笔宽很大时,画到窗体边框上去了
    painter.drawEllipse(m_nPenWidth, m_nPenWidth, this->width() - twicePenWidth, this->height() - twicePenWidth);
}

使用Qt的Release模式构建项目。构建完成后会默认在pro上级目录(如果没有更新构建目录的情况下)生成构建目录,在构建目录中的对应构建模式(Debug模式和Release模式)的同名文件夹中会包含库的相关文件(如下图)

将库文件拷贝到对应的Qt安装目录中,如我将其拷贝到如下两个目录:

/home/dansir/Qt5.14.1/5.14.1/gcc_64/plugins/designer
/home/dansir/Qt5.14.1/Tools/QtCreator/lib/Qt/plugins/designer

注意:如果你是在Windows下用Visual Studio +  Qt Visual Studio Tools开发,则需要将生成的dll和lib文件拷贝到如下两个目录:

D:\Qt\Qt5.12.4\Tools\QtCreator\bin\plugins\designer
D:\Qt\Qt5.12.4\5.12.4\msvc2017\plugins\designer

如下:

 

上述目录,请根据你本机实际更改。同理,拷贝到的目标文件夹需要与构建版本对应。

重启QtCreator,若是自定义插件添加成功,在Qt设计师中会自动生成‘自定义窗口部件’的模块,然后就可将自定义的插件当成普通项目使用,如下:

按如下步骤进行:

  1. 在设计师中拖动自定义的插件到窗体。
  2. 在设计师右侧控件属性面板更改控件的属性。

4. 注意的问题

      如果在步骤3中,将生成的插件放到指定目录,重启QtCreator出现奔溃退出,则说明编写的自定义插件有异常,请排除该异常,则QtCreator就能起来了。

5. 参考链接

【1】:Qt之自定义插件(单控件,Qt设计师中使用)。

【2】:编写Qt Designer自定义控件(二)——编写自定义控件界面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/145947.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker - 网络

Docker - 网络 理解Docker0 # 我们发现这个容器带来网卡&#xff0c;都是一对对的 # evth-pair 就是一对的虚拟设备接口&#xff0c;他们都是成对出现的&#xff0c;一段连着协议&#xff0c;一段彼此相连 # 正因为有了这个特性&#xff0c;evth-pair 充当一个桥梁&#xff0…

图片高清重建

图像超分辨率重建&#xff08;super resolution,SR&#xff09;是指利用计算机将一幅低分辨率图像&#xff08;low resolution,LR&#xff09;或图像序列进行处理&#xff0c;恢复出高分辨率图像&#xff08;high resolution&#xff0c;HR&#xff09;的一种图像处理技术。简单…

腾讯云4核8G服务器CVM标准型S5实例租用五年价格表

腾讯云服务器网整理五年云服务器活动 txyfwq.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频…

【C#学习】button:只显示图片

第一步&#xff1a;设置按钮背景图片&#xff0c;并且图片随按钮大小变化 第二步&#xff1a;设置按钮使之只显示图片 button1.FlatStyle FlatStyle.Flat;//stylebutton1.ForeColor Color.Transparent;//前景button1.BackColor Color.Transparent;//去背景button1.FlatAppe…

修改Openwrt软路由的web端口

如何修改openwrt路由器的web访问端口号&#xff1f; 在OpenWrt路由器上&#xff0c;如何修改Web访问端口号&#xff0c;通常涉及到修改HTTP服务器的配置文件。默认情况下&#xff0c;OpenWrt使用的HTTP服务器是uHTTPd。 以下是修改Web访问端口号的步骤&#xff1a; 一、通过…

Meta开源支持1000多种语言的文本转语音与语音识别大语言模型

据不完全统计,地球上有超过7000多种语言,而现在的大语言模型仅仅只涉及到了主流的100多种语言。相对全球7000多种语言来讲,这仅仅只是其中的一小部分。如何让全球的人获益,把大语言模型扩展到更多的语言上,一直是大语言模型研究的重点。Meta发布了涵盖 1406 种语言的预训练…

一篇文章教会你什么是C++异常

一篇文章教会你什么是C异常 C语言传统的处理错误的方式断言检查返回值检查全局错误码设置全局错误处理函数 C异常概念基本概念注意事项 异常的使用异常的抛出和捕获异常的重新捕获异常安全异常规范 自定义异常体系C标准库的异常体系1. std::exception2. std::bad_alloc3. std::…

【算法每日一练]-图论(保姆级教程 篇1(模板篇)) #floyed算法 #dijkstra算法 #spfa算法

今天开始讲图论 目录 图的存储 算任意两点的最短路径: floyed算法&#xff1a; 算一个点到其他所有点的最短距离 dijkstra算法: spfa算法&#xff1a; 图的存储 其实&#xff1a;邻接矩阵和链式向前星都能存边的信息&#xff0c;vector只能存点的信息&#xff0c;再搭配上v[]…

2023年【汽车驾驶员(中级)】考试题库及汽车驾驶员(中级)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;中级&#xff09;考试题库根据新汽车驾驶员&#xff08;中级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将汽车驾驶员&#xff08;中级&#xff09;模拟考试试题进行汇编&…

产品运营的场景和运营策略

一、启动屏 1&#xff0e;概念 启动屏&#xff0c;特指 APP 产品启动时即显示的界面&#xff0c;这个界面一般会停留几秒钟时间&#xff0c;在这个时间内 APP 会在后台加载服务框架、启动各种服务 SDK 、获取用户地理位置、判断有无新版本、判断用户账户状态以及其他系统级别的…

QGIS之十九矢量投影

效果 步骤 1、准备数据 2、Qgis矢量投影 Qgis工具箱中搜索“投影” 3、结果

鸿蒙HarmonyOS从零实现类微信app效果第一篇,基础界面搭建

最近鸿蒙HarmonyOS开发相关的消息非常的火&#xff0c;传言华为系手机后续将不再支持原生Android应用&#xff0c;所以对于原Android应用开发对应的Harmony版本也被一系列大厂提上了日程。作为一个名义上的移动端开发工程师&#xff08;(⊙o⊙)…&#xff0c;最近写python多过A…

【计算机网络】VLAN原理和配置

目录 1、VLAN的原理 1.1、什么是VLAN 1.2、为什么要使用VLAN 1.3、VLAN的三种端口类型 1.4、VLAN的划分方法 2、VLAN的配置 1、VLAN的原理 1.1、什么是VLAN VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上…

十年软件测试老程序告诉你性能测试的左移右移到底能干嘛

常规的性能测试一般都是在测试阶段集成测试时候才开始介入&#xff0c;很容易测试时间不够&#xff0c;可不可以借鉴测试左移右移的思路&#xff0c;更早的介入和发现性能风险&#xff0c;然后在测试阶段更专注于分析优化&#xff1f; 借着这个问题&#xff0c;结合自己的实践…

Maven依赖管理项目构建工具的安装与配置

本篇来自尚硅谷的笔记&#xff0c;在线视频观看&#xff1a;Maven依赖管理项目构建工具&#xff0c;更多笔记欢迎访问&#xff1a;小熊学Java 一、Maven简介 1、为什么学习Maven 1.1、Maven是一个依赖管理工具 ①jar 包的规模 随着我们使用越来越多的框架&#xff0c;或者框…

linux DMA设备驱动详解

一&#xff0c;DMA相关定义&#xff08;fpga、wait_queue 、device、interrupt、 dma_request_channel 函数、dma_start_transfer函数、poll、read&#xff0c;platform总线&#xff09; DMA (直接内存读写)是Direct Memory Access的缩写&#xff0c;也就是内存到内存&#xf…

k8s自定义Endpoint实现内部pod访问外部应用

自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云&#xff0c; 一部分云原生的&#xff0c;一部分是实体的 业务上云期间逐步实现上云&#xff0c;保证各个模块之间的解耦性 比如使…

使用GPT-4训练数据微调GPT-3.5 RAG管道

原文&#xff1a;使用GPT-4训练数据微调GPT-3.5 RAG管道 - 知乎 OpenAI在2023年8月22日宣布&#xff0c;现在可以对GPT-3.5 Turbo进行微调了。也就是说&#xff0c;我们可以自定义自己的模型了。然后LlamaIndex就发布了0.8.7版本&#xff0c;集成了微调OpenAI gpt-3.5 turbo的…

敏捷开发中如何写好用户故事

写好用户故事是敏捷开发中非常重要的一环&#xff0c;它们是描述用户需求的核心。以下是一些关于如何编写优秀用户故事的建议&#xff1a; 使用标准模板&#xff1a; 一个常用的用户故事模板是“As a [用户角色]&#xff0c;I want [功能]&#xff0c;so that [价值]”。这种模…

《RT-DETR魔术师》专栏介绍 CSDN独家改进创新实战 专栏目录

RT-DETR魔术师专栏介绍&#xff1a; https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR &#x1f680;&#x1f680;&#x1f680;引入前沿顶会创新&#xff08;CVPR2023&#xff0c;ICCV2023等&#xff09;&#xff0c;助力RT-DETR &#…