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成功使用界面如下:
 
 
 

最新文章

  1. 在运行Hibernate Hello World程序的时候,抛如下错误: view plain Exception in thread &quot;main&quot; org.hibernate.exception.LockAcquisitionException 解决方法
  2. 【JavaEE企业应用实战学习记录】struts国际化
  3. python中的Queue
  4. Direct3D11学习:(三)Direct3D11初始化
  5. IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法
  6. 二 mybatis 动态sql
  7. 解决IIS6.0不能下载EXE文件之妙方!
  8. android99 拍照摄像
  9. 图文讲解基于centos虚拟机的Hadoop集群安装,并且使用Mahout实现贝叶斯分类实例 (7)
  10. pthread_exit在main线程中的用处
  11. Shell命令-文件及内容处理之cat、tac
  12. 如何下载官网上下载历史Java版本(老版本Java)
  13. pyqt5安装问题
  14. 剑指Offer_编程题_4
  15. mysql 安装部署
  16. phpstorm开启xdebug断点调试,断点调试不成功来这里
  17. VKD224B触摸芯片调试笔记
  18. 更换 homebrew 国内镜像源
  19. Spring IOC容器创建bean过程浅析
  20. 【枚举Day1】20170529-2枚举算法专题练习 题目

热门文章

  1. vue-cli3 本地数据模拟后台接口
  2. linux文件目录详细介绍
  3. MYSQL WHERE语句
  4. ZPL语言完成条形码的打印
  5. Apache httpclient的execute方法调试
  6. 简单的flask对象
  7. sql 随机数系列
  8. 嵌入式Linux应用开发完全手册读书笔记——交叉编译工具选项说明
  9. LoadRunner(7)
  10. string::cbegin string::cend