Qt Designer自定义控件创建、使用

如何创建一个自定义的QWidget控件并导入Qt Designer 中进行使用?

一、创建Qt Designer自定义控件

第一步: 创建Qt Designer自定义控件工程

打开Qt Creator,创建一个Qt 设计师自定义控件。

根据向导创建控件工程,并填写控件类名称、说明、以及docxml默认添加的属性信息

Qt Designer自定义控件主要是集成、实现QDesignerCustomWidgetInterface接口,在Qt Designer设计器加载ui的时候,会加载环境中这些实现了该接口的特殊图形控件。

这个工程创建后,会生成myclockplugin类,其中domXml、name、group可以根据自己的需求进行修改,默认也可以。

第二步: 实现自己的QWidget控件

然后,MyClock类才是真正实现自己定义的QWidget,可以重新绘制图形控件,也可以添加新的属性、方法等等。

这里以MyClock是参照Qt 例子中Analog Clock example做的一个钟表,主要就是在paintEvent函数中重新绘制了钟表图形,具体可以参照Analog Clock的代码。

第三步: 生成自定义控件dll并安装到Qt 工具内

编译构建自定义控件工程,会生成自定义控件的动态库文件

将myclockplugin.dll安装到Qt环境中,也就是C:\Qt\Qt5.9.1\Tools\QtCreator\bin\plugins\designer路径下。

重启Qt Creator工程后,打开Qt Designer工具就能在左侧列表中找到自定义的控件加载到设计器列表中。

二、给自定义控件属性

所有集成QObject的Qt类对象,都通过Qt的元对象系统查询到它,获取对象的属性、方法、信号等等,这里想要给自定义的控件追加一个属性,并想显示到设计器的列表中,需要给控件类追加Q_PROPERTY属性,具体如下:

class QDESIGNER_WIDGET_EXPORT MyClock : public QWidget
{Q_OBJECTQ_ENUMS(InputMode)Q_PROPERTY(InputMode inputMode READ inputMode WRITE setInputMode
public:MyClock(QWidget *parent = 0);enum InputMode{ZONE_0 = 0,      //float number modeZONE_1,ZONE_2//Degree second minute mode};InputMode inputMode()const;void setInputMode(const InputMode mode);
public slots:void setTimeZone(int hourOffset);
signals:void updated(QTime currentTime);
protected:void paintEvent(QPaintEvent *event) override;
private:int timeZoneOffset;InputMode m_Mode;
};
MyClock::MyClock(QWidget *parent) :QWidget(parent),timeZoneOffset(0),m_Mode(ZONE_0)
{//! [3] //! [4]QTimer *timer = new QTimer(this);//! [4] //! [5]connect(timer, SIGNAL(timeout()), this, SLOT(update()));//! [5] //! [6]timer->start(1000);//! [6]setWindowTitle(tr("Analog Clock"));resize(400, 400);//! [7]
}
void MyClock::paintEvent(QPaintEvent *)
//! [8] //! [10]
{static const QPoint hourHand[3] = {QPoint(7, 8),QPoint(-7, 8),QPoint(0, -40)};static const QPoint minuteHand[3] = {QPoint(7, 8),QPoint(-7, 8),QPoint(0, -70)};QColor hourColor(127, 0, 127);QColor minuteColor(0, 127, 127, 191);int side = qMin(width(), height());QTime time = QTime::currentTime();time = time.addSecs(timeZoneOffset);
//! [10]//! [11]QPainter painter(this);
//! [11] //! [12]painter.setRenderHint(QPainter::Antialiasing);
//! [12] //! [13]painter.translate(width() / 2, height() / 2);
//! [13] //! [14]painter.scale(side / 200.0, side / 200.0);
//! [9] //! [14]//! [15]painter.setPen(Qt::NoPen);
//! [15] //! [16]painter.setBrush(hourColor);
//! [16]//! [17] //! [18]painter.save();
//! [17] //! [19]painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));painter.drawConvexPolygon(hourHand, 3);painter.restore();
//! [18] //! [19]//! [20]painter.setPen(hourColor);
//! [20] //! [21]for (int i = 0; i < 12; ++i) {painter.drawLine(88, 0, 96, 0);painter.rotate(30.0);}
//! [21]//! [22]painter.setPen(Qt::NoPen);
//! [22] //! [23]painter.setBrush(minuteColor);//! [24]painter.save();painter.rotate(6.0 * (time.minute() + time.second() / 60.0));painter.drawConvexPolygon(minuteHand, 3);painter.restore();
//! [23] //! [24]//! [25]painter.setPen(minuteColor);
//! [25] //! [26]//! [27]for (int j = 0; j < 60; ++j) {if ((j % 5) != 0)painter.drawLine(92, 0, 96, 0);painter.rotate(6.0);}
//! [27]
}
void MyClock::setTimeZone(int hourOffset)
{setInputMode(InputMode(hourOffset));
}
MyClock::InputMode MyClock::inputMode() const
{return m_Mode;
}
void MyClock::setInputMode(const InputMode mode)
{timeZoneOffset = qMin(qMax(-12, int(mode)), 12) * 3600;update();
}

Q_PROPERTY 追加一个修改时区的属性值,编译完成后,安装到Qt Tool中,重启就可以在设计器中修改该属性。

三、在工程中使用自定义控件

创建一个工程,把MyClock添加到自己的ui中,注意需要把MyClock插件的lib、头文件引到工程内,方便运行调试

inputMode也在右侧属性列表中,可以在设计器里直接设置属性值

在声明MyClock类的时候,追加了QDESIGNER_WIDGET_EXPORT,这样能够保证MyClock类内的信号、槽函数等能够正确地被Qt Designer进入进去,比如:

public slots:void setTimeZone(int hourOffset);
signals:void updated(QTime currentTime);

setTimeZone和updated就可以在设计器中操作信号、操处理。

运行demo,当更改时区后,钟表和timeEdit也跟着更新,这就是通过设计器内绑定的信号槽关系处理的,这些都不需要再在demo工程中去重新代码来实现了。

Qt Designer自定义控件创建、使用相关推荐

  1. linux qt 自定义控件,编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件...

    要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:"升级(promo ...

  2. PyQt4学习4之---采用Qt Designer拖动创建计算器界面

    目录 1.新建一个项目 2.进行显示 3.main.py的细解读 本系列文章前情回顾: PyQt4学习1之---菜单栏(addMenu).工具栏(addToolBar).TextEdit工具框 PyQ ...

  3. 编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件

    在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...

  4. Qt创建设计师自定义控件(Qt Designer自定义控件)

    Qt提供了一个Designer界面,使得我们可以自由拖动控件对ui进行布局,但所有的控件都是固定的,如果我们想要自定义一个自己设计的控件,添加到Designer中,可供设计者自由设计.那么可以进行如下 ...

  5. distiller的另一个实例正忙于启动_PYQT5学习(02):利用Qt Designer制作第一个窗口程序

    目标 利用Qt Designer设计窗口界面 使用PyUIC把Qt Designer生成的UI文件转换为py文件 使用转换生成的py文件 创建项目 启动启动pycharm并创建项目 这一环节在这里就不 ...

  6. pycharm设置-使用Qt Designer配置

    pycharm设置-使用Qt Designer配置 针对在pycharm中配置后方便直接调用Qt 设计UI界面 步骤如下: 1.打开pytcharm 界面 - 文件 - 设置 - 工具- 外部工具 2 ...

  7. Qt Designer入门教程 初学者必看

    在Linux下,一个非常流行的RAD工具就是Qt Designer.它是嵌入式公司 Trolltech的Qt软件包的一个组成部分. Qt Designer入门教程 初学者必看是本文要介绍的内容,不说这 ...

  8. Ubuntu Linux安装PyQt5并配置Qt Designer

    Ubuntu Linux安装PyQt5并配置Qt Designer PyQt5 创建独立环境 创建conda环境 安装pyqt5 查看版本 安装图形界面Qt Designer pycharm 配置 v ...

  9. Qt自定义控件创建和使用

    Qt自定义控件创建和使用 Qt中很方便的是使用各种自定义控件来分模块实现各种子功能,用于实现代码的解耦: 之前在使用Qt 5.12创建自定义控件时,出现了各种问题,多次重装QtCreator和VS,屡 ...

最新文章

  1. python之接口开发
  2. UIScrollView offset in UINavigationController
  3. Oracle SQL Loader的详细语法
  4. 一幅图读懂量子力学(数学的判决)
  5. 一个中等规模的七段数码数据库以及利用它训练的识别网络
  6. shell编程中crontab用法超级详解!
  7. NYOJ 679 The Weight of Tree 搜索+dp+邻接表
  8. AcWing 312. 乌龟棋
  9. json web token没有哪个成分_SpringBoot 2.1.4集成JWT实现token验证
  10. 计算机应用基础形成性考核作业,计算机应用基础形成性考核作业1
  11. 注解参数获取不到_scm-springboot基于spring boot的统一注解缓存
  12. 【Java】MapReduce 程序五步走的思想详细描述
  13. Stanford CS230深度学习(七)RNN和LSTM
  14. ABB机器人Whlie循环指令
  15. 64位Ubuntu14.04系统无法解压bin文件的解决方法
  16. AcWing 188. 武士风度的牛
  17. MySQL:网络连接框架简析
  18. CorelDRAW2022新版首发功能曝光介绍
  19. 苹果鼠标怎么充电_“智能”还是“多功能”?米物智能鼠标垫测评
  20. 通用嵌入式系统测试平台 ETest简介

热门文章

  1. MYSQL 获取本周、本月每天,本季度、近半年、本年、近一年的每个月份
  2. 微信小程序日历打卡组件wx-calendar
  3. 智能手机未来十年的发展趋势
  4. 如何做到年薪 50 万的程序员?
  5. python post和get区别_python爬虫post和get有什么不同,区别是什么
  6. C++中rvalue和lvalue详悉
  7. 在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P2)
  8. jenkin 发布失败 没有日志
  9. Schema简单应用
  10. Oracle 18c 新特性-在线合并分区和子分区