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. Java API 之 SPI机制

    SPI SPI全称是service provider interface,是Java定义的一套服务发现机制,如图: 调用方只需要面向接口,接口的实现由第三方自己去实现,服务启动的时候会自动去发现该服务 ...

  2. ES6入门:数据劫持、Proxy、Reflect

    什么是数据劫持 Object数据劫持实现原理 Array数据劫持的实现原理 Proxy.Reflect 一.什么是数据劫持 定义:访问或者修改对象的某个属性时,在访问和修改属性值时,除了执行基本的数据 ...

  3. c++容易混淆知识点

    C ++令人困惑的知识点1 函数传递指针和传递引用之间的区别? 1 GT;指针定义可能未初始化,但引用不可能; 2 - ;引用只能与一个实体组合,指针可以与多个实体组合; 3 GT;加法和减法的含义是 ...

  4. CompletionService异步非阻塞获取并行任务执行结果

    第1部分 问题引入 <Java并发编程实践>一书6.3.5节CompletionService:Executor和BlockingQueue,有这样一段话: "如果向Execut ...

  5. opencv读取图像python和c++版本的结果不同

    问题: 在读取同一张图像时,python读取的结果和c++读取的结果差异较大,测试图像中最大误差达到16. 原因: python的opencv采用的是4.1.1,c++采用的是3.1.0,在解析JPE ...

  6. Linux下的头文件搜索路径

         对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执 ...

  7. kubernetes之node隔离与恢复

    需求: 在硬件升级, 硬件维护等情况下, 我们需要将某些node隔离, kubectl cordon <node_name> #禁止pod调度到该节点上, 在其上运行的pod并不会自动停止 ...

  8. c#读取文件路径并保存在textBox2中

    private void button1_Click_1(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new Open ...

  9. windows下通过批处理脚本启动redis

    三种启动方式的特点: 第一种方式 :根目录之命令窗口启动 特点:每次启动都要进入到redis的根目录,比较繁琐,并且占用一个窗口 第二种方式:bat脚本便捷启动 特点:可放在桌面便捷启动,占用窗口 第 ...

  10. Vue入门(二)——Demo

    1.在工程目录下创建项目 右键GIT BASH 2.安装lib(建议使用淘宝镜像安装) 3.首页 App.vue <template> <el-container> <e ...