QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)
 

改进法

 
1、改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件。把这两个文件拷贝到想要的项目中。
 
HexspinBox.h
  1. #ifndef HEXSPINBOX_H
  2. #define HEXSPINBOX_H
  3. #include <QSpinBox>
  4. class QRegExpValidator;
  5. class HexSpinBox : public QSpinBox
  6. {
  7. Q_OBJECT
  8. public:
  9. HexSpinBox(QWidget *parent = 0);
  10. protected:
  11. QValidator::State validate(QString &text, int &pos) const;
  12. int valueFromText(const QString &text) const;
  13. QString textFromValue(int value) const;
  14. private:
  15. QRegExpValidator *validator;
  16. };
  17. #endif
 
 HexspinBox.cpp
  1. #include <QtGui>
  2. #include "hexspinbox.h"
  3. HexSpinBox::HexSpinBox(QWidget *parent)
  4. : QSpinBox(parent)
  5. {
  6. setRange(0, 255);
  7. validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);
  8. }
  9. QValidator::State HexSpinBox::validate(QString &text, int &pos) const
  10. {
  11. return validator->validate(text, pos);
  12. }
  13. int HexSpinBox::valueFromText(const QString &text) const
  14. {
  15. bool ok;
  16. return text.toInt(&ok, 16);
  17. }
  18. QString HexSpinBox::textFromValue(int value) const
  19. {
  20. return QString::number(value, 16).toUpper();
  21. }
2、在需要开发的项目中的窗口中,
 
1、用Qt Designer创建一个新的窗体main.ui,把控件箱里的QSpinBox添加到窗体中。
 
2、右击微调框,选择“Promote to ”上下文菜单。
 
3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h”
 
好了。在ui生成的包含有QSpinBox的控件文件中,ui的源代码里面多了一段
<customwidgets>
  <customwidget>
   <class>HSpinBox</class>
   <extends>QSpinBox</extends>
   <header>hspinbox.h</header>
  </customwidget>
包含文件变为"hexspinbox.h"。在Qt Designer中,QSpinBox表示的控件为HexSpinBox,并且可以设置所有的QSpinBox的属性。
可以在VS2008中编译一下main.ui文件,从ui_main.h源代码中可以知道,引入的控件是:
  1. #include <QtGui/QTableWidget>
  2. #include <QtGui/QToolBar>
  3. #include <QtGui/QWidget>
  4. #include "hspinbox.h"
  5. QT_BEGIN_NAMESPACE
  6. class Ui_QMainClass
  7. {
  8. public:
  9. QWidget *centralWidget;
  10. QPushButton *pushButton;
  11. QTableWidget *tableWidget;
  12. QSpinBox *spinBox;
  13. HSpinBox *hspinBox;
   
升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。这些问题可以用插件法解决。

插件法

 
1.VS中创建Qt4 Design Plugin 工程 ,名称叫custom
 
自动建立如下几个文件:
自定义控件:custom.h,custom.cpp
插件:customplugin.h,customplugin.cpp
源代码如下:

custom.h

  1. #ifndef CUSTOM_H
  2. #define CUSTOM_H
  3. #include <QtGui/QWidget>
  4. #include "ui_test.h"
  5. class custom : public QWidget
  6. {
  7. Q_OBJECT
  8. public:
  9. custom(QWidget *parent = 0);
  10. ~custom();
  11. private:
  12. Ui::Form ui;
  13. };
  14. #endif // CUSTOM_H

custom.cpp

  1. #include "custom.h"
  2. custom::custom(QWidget *parent)
  3. : QWidget(parent)
  4. {
  5. ui.setupUi(this);
  6. }
  7. custom::~custom()
  8. {
  9. }

customplugin.h

  1. #ifndef CUSTOMPLUGIN_H
  2. #define CUSTOMPLUGIN_H
  3. #include <QDesignerCustomWidgetInterface>
  4. class customPlugin : public QObject, public QDesignerCustomWidgetInterface
  5. {
  6. Q_OBJECT
  7. Q_INTERFACES(QDesignerCustomWidgetInterface)
  8. public:
  9. customPlugin(QObject *parent = 0);
  10. bool isContainer() const;
  11. bool isInitialized() const;
  12. QIcon icon() const;
  13. QString domXml() const;
  14. QString group() const;
  15. QString includeFile() const;
  16. QString name() const;
  17. QString toolTip() const;
  18. QString whatsThis() const;
  19. QWidget *createWidget(QWidget *parent);
  20. void initialize(QDesignerFormEditorInterface *core);
  21. private:
  22. bool initialized;
  23. };
  24. #endif // CUSTOMPLUGIN_H
 customplugin.cpp
  1. #include "custom.h"
  2. #include <QtCore/QtPlugin>
  3. #include "customplugin.h"
  4. customPlugin::customPlugin(QObject *parent)
  5. : QObject(parent)
  6. {
  7. initialized = false;
  8. }
  9. void customPlugin::initialize(QDesignerFormEditorInterface */*core*/)
  10. {
  11. if (initialized)
  12. return;
  13. initialized = true;
  14. }
  15. bool customPlugin::isInitialized() const
  16. {
  17. return initialized;
  18. }
  19. QWidget *customPlugin::createWidget(QWidget *parent)
  20. {
  21. return new custom(parent);
  22. }
  23. QString customPlugin::name() const
  24. {
  25. return "custom";
  26. }
  27. QString customPlugin::group() const
  28. {
  29. return "My Plugins";
  30. }
  31. QIcon customPlugin::icon() const
  32. {
  33. return QIcon();
  34. }
  35. QString customPlugin::toolTip() const
  36. {
  37. return QString();
  38. }
  39. QString customPlugin::whatsThis() const
  40. {
  41. return QString();
  42. }
  43. bool customPlugin::isContainer() const
  44. {
  45. return false;
  46. }
  47. QString customPlugin::domXml() const
  48. {
  49. return "<widget class=\"custom\" name=\"custom\">\n"
  50. " <property name=\"geometry\">\n"
  51. "  <rect>\n"
  52. "   <x>0</x>\n"
  53. "   <y>0</y>\n"
  54. "   <width>100</width>\n"
  55. "   <height>100</height>\n"
  56. "  </rect>\n"
  57. " </property>\n"
  58. "</widget>\n";
  59. }
  60. QString customPlugin::includeFile() const
  61. {
  62. return "custom.h";
  63. }
  64. Q_EXPORT_PLUGIN2(custom, customPlugin)
在其cpp的最后必须 添加下面的宏:
  1. Q_EXPORT_PLUGIN2(customWidgetPlugin, CustomWidgetPlugin) // 第一个参数为插件的名字,第二个是插件类的名字(而不是自定义控件的类名)
 
2.  新建后,直接编译,会产生如下错误 
 
1>LINK : fatal error LNK1181: cannot open input file 'QtDesignerd.lib' 
 
      这是因为此工程默认引用的是QtDesignerd.lib库,更改其为版本对应的库即可消除故障(VS2008是在项目的属性中Linker/input/Additional Dependencies中修改,我这里Debug配置使用的是QtDesignerd4.lib,Release版本使用QtDesigner4.lib)。 
 
3、使用自定义插件
    1)、只需要把通过Release模式生成的  项目.lib和项目.dll文件拷到C:\Qt\4.7.4\plugins\designer中,
    2)、 然后在QtDesigner中,选择菜单Help/About Plugin就可以看到你的自定义控件是否已经载入成功。
在QtDesigner中控件列表中有一项My Widget 中就有你的自定义控件。
 
参考:
 
 
 
打开QtDesigner,我们自定义的空间custom成功使用界面如下:
 
 
 

Qt自定义窗口部件的更多相关文章

  1. Qt入门(19)——自定义窗口部件

    我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange().        void setRange( int minVal, int maxV ...

  2. C++ GUI Qt4编程-创建自定义窗口部件

    C++ GUI Qt4编程-创建自定义窗口部件   Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部 ...

  3. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  4. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)

    1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...

  5. Qt学习之自定义窗口部件

    自定义Qt窗口部件 实现一个十六进制的SpinBox,一般SpinBox只支持十进制整数,但是可以子类化方法实现该功能 需重新实现以下虚函数 virtual QString textFromValue ...

  6. QT自定义窗口(模拟MainWindow)

    在这里自定义窗口是通过继承于QFrame,内部分为上下两部分,上半部分就是标题栏,下面是窗口的具体内容.上下两部分通过布局固定位置.最后窗口的各种鼠标拖动,缩放,等操作通过添加鼠标事件来完成一个窗口的 ...

  7. QT自定义窗口

    qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ...

  8. QT5中如何自定义窗口部件

    提升法 eg.(定义一个新的QLable部件)1.定义一个类class Label : public base, public QLabel //可以支持多重继承2.在qt creator中打开ui编 ...

  9. qt 自定义窗口绘制正弦曲线

    circlewidget.h #ifndef CIRCLAWIDGET_H #define CIRCLAWIDGET_H #include <QFrame> #include<QVe ...

随机推荐

  1. javabean转成json字符首字母大写

    今天写接口的时候有个需求将接口返回的json字符串首字母大写:{"SN":"","Result":""}格式, 只需要在 ...

  2. PHP转码函数mb_convert_encoding() 和iconv()

    注意:函数mb_convert_encoding的执行效率比iconv差,且需开启php的mbstring扩展. 一般情况下使用iconv,但此函数在碰到无法转码字符会丢弃,此种情况下可以用mb_co ...

  3. SQL学习——BETWEEN运算符

    原文链接 BETWEEN的作用 BETWEEN 操作符用于选取介于两个值之间的数据范围内的值. BETWEEN的边界 BETWEEN运算符选择给定范围内的值.值可以是数字,文本或日期. BETWEEN ...

  4. 2.3 使用 dom4j 对 xml文件进行 dom 解析

    // 使用dom4j对XML文档进行解析 CRUD public class Demo1 { //读取XML文档中第二本书的书名 <书名>javaWEB</书名> @Test ...

  5. PAT Basic 1083 是否存在相等的差 (20 分)

    给定 N 张卡片,正面分别写上 1.2.…….N,然后全部翻面,洗牌,在背面分别写上 1.2.…….N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差? 输入格式: ...

  6. okhttp缓存策略源码分析:put&get方法

    对于OkHttp的缓存策略其实就是在下一次请求的时候能节省更加的时间,从而可以更快的展示出数据,那在Okhttp如何使用缓存呢?其实很简单,如下: 配置一个Cache既可,其中接收两个参数:一个是缓存 ...

  7. 【Java基础 项目实例 -- Bank项目2】Account 和 customer 对象

    总结: customer.setAccount(account); //引用,日后的account 和 customer.getAccount()的结果始终一致 实验目的 扩展银行项目,添加一个 Cu ...

  8. Mysql导入Excel数据 日期问题 (Excel 与 MySQL 时间戳格式和日期 互转)

    https://blog.csdn.net/ghw455954461/article/details/7247738 今天项目表中需要导入好几w条数据 ,但日期由两个一个是标准时间一个为时间戳,程序中 ...

  9. flyio 的请求封装

    1.安装flyio.js npm install flyio --save-dev 2.在util创建一个fly.js用于封装 import Vue from 'vue' var Fly=requir ...

  10. org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException

    org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method ...