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

改进法

1、改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件。把这两个文件拷贝到想要的项目中。
HexspinBox.h
#ifndef HEXSPINBOX_H
#define HEXSPINBOX_H
#include <QSpinBox>
class QRegExpValidator;
class HexSpinBox : public QSpinBox
{Q_OBJECTpublic:HexSpinBox(QWidget *parent = 0);protected:QValidator::State validate(QString &text, int &pos) const;int valueFromText(const QString &text) const;QString textFromValue(int value) const;private:QRegExpValidator *validator;
};#endif

HexspinBox.cpp
#include <QtGui>
#include "hexspinbox.h"
HexSpinBox::HexSpinBox(QWidget *parent): QSpinBox(parent)
{setRange(0, 255);validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);
}QValidator::State HexSpinBox::validate(QString &text, int &pos) const
{return validator->validate(text, pos);
}int HexSpinBox::valueFromText(const QString &text) const
{bool ok;return text.toInt(&ok, 16);
}QString HexSpinBox::textFromValue(int value) const
{return QString::number(value, 16).toUpper();
}

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源代码中可以知道,引入的控件是:
#include <QtGui/QTableWidget>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>
#include "hspinbox.h"QT_BEGIN_NAMESPACEclass Ui_QMainClass
{
public:QWidget *centralWidget;QPushButton *pushButton;QTableWidget *tableWidget;QSpinBox *spinBox;HSpinBox *hspinBox;

升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。这些问题可以用插件法解决。

插件法

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

custom.h

#ifndef CUSTOM_H
#define CUSTOM_H
#include <QtGui/QWidget>
#include "ui_test.h"
class custom : public QWidget
{Q_OBJECT
public:custom(QWidget *parent = 0);~custom();
private:Ui::Form ui;
};#endif // CUSTOM_H

custom.cpp

#include "custom.h"custom::custom(QWidget *parent): QWidget(parent)
{ui.setupUi(this);
}custom::~custom()
{}

customplugin.h

#ifndef CUSTOMPLUGIN_H
#define CUSTOMPLUGIN_H#include <QDesignerCustomWidgetInterface>class customPlugin : public QObject, public QDesignerCustomWidgetInterface
{Q_OBJECTQ_INTERFACES(QDesignerCustomWidgetInterface)public:customPlugin(QObject *parent = 0);bool isContainer() const;bool isInitialized() const;QIcon icon() const;QString domXml() const;QString group() const;QString includeFile() const;QString name() const;QString toolTip() const;QString whatsThis() const;QWidget *createWidget(QWidget *parent);void initialize(QDesignerFormEditorInterface *core);private:bool initialized;
};#endif // CUSTOMPLUGIN_H
customplugin.cpp
#include "custom.h"
#include <QtCore/QtPlugin>
#include "customplugin.h"
customPlugin::customPlugin(QObject *parent): QObject(parent)
{initialized = false;
}void customPlugin::initialize(QDesignerFormEditorInterface */*core*/)
{if (initialized)return;initialized = true;
}bool customPlugin::isInitialized() const
{return initialized;
}QWidget *customPlugin::createWidget(QWidget *parent)
{return new custom(parent);
}QString customPlugin::name() const
{return "custom";
}QString customPlugin::group() const
{return "My Plugins";
}QIcon customPlugin::icon() const
{return QIcon();
}QString customPlugin::toolTip() const
{return QString();
}QString customPlugin::whatsThis() const
{return QString();
}bool customPlugin::isContainer() const
{return false;
}QString customPlugin::domXml() const
{return "<widget class=\"custom\" name=\"custom\">\n"" <property name=\"geometry\">\n""  <rect>\n""   <x>0</x>\n""   <y>0</y>\n""   <width>100</width>\n""   <height>100</height>\n""  </rect>\n"" </property>\n""</widget>\n";
}QString customPlugin::includeFile() const
{return "custom.h";
}Q_EXPORT_PLUGIN2(custom, customPlugin)

在其cpp的最后必须 添加下面的宏:

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  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 中就有你的自定义控件。
参考:
1、Qt自定义控件(插件)并添加到QtDesigher

打开QtDesigner,我们自定义的空间custom成功使用界面如下:

【原创】Qt自定义窗口部件相关推荐

  1. Qt4_在Qt设计师中集成自定义窗口部件

    在Qt设计师中集成自定义窗口部件 在Qt设计师中使用自定义窗口部件之前,我们必须让Qt设计师先察觉到它们的存在.有两种方法可以完成这一任务:改进法(promotion)和插件法(pluigin). 改 ...

  2. QT自定义窗口插件在QT Creator的应用

    根据<C++ GUI Programming with Qt 4,Second Edition>中第5章的"在Qt设计师中集成自定义窗口部件"小节,使用插件法生成的窗口 ...

  3. python做一个窗口样式_python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法...

    本文借用HTML的css语法,将样式表应用到窗口部件.这里只是个简单的例子,实际上样式表的语法很丰富. 以下类似于css: StyleSheet = """ QCombo ...

  4. qt自定义窗口添加父窗口后,显示不出来

    提要 继承于QDialog的类,在被其它类创建的改对象时,没设置父窗口前显示正常,设置了父窗口后显示不出来. 自定义窗口的构造函数 configBtnNameDialog::configBtnName ...

  5. 【QT】QT从零入门教程(十一):QT自定义窗口

      首先是借鉴了网上的博客,实现无边框,自由拖动的自定义窗口效果. #ifndef CUSTOMWINDOW_H #define CUSTOMWINDOW_H #include <QtGui&g ...

  6. qt自定义窗口,其绘制的窗口边框线显示不全

    引言 自定义窗口,该窗口包含标题栏,默认整个窗口的边框线为蓝色,当点击该窗口的时候,窗口的边框线便为红色.程序在运行的时候,窗口的边框线只显示了左右两边的线,没有显示上下边的线. 示例 效果: 解决方 ...

  7. QT自定义窗口,可拉伸

    //头文件 #ifndef CUSTOMDIALOG_H #define CUSTOMDIALOG_H#include <QDialog>// 定义当前鼠标所处状态; enum Windo ...

  8. qt 自定义窗口customwindow

    原文链接:https://qt.developpez.com/tutoriels/braindeadbzh/customwindow/

  9. Qt窗口部件——QFrame/QAbstractButton/QLineEdit/QAbstractSpinBox/QAbstractSlider

    Qt其他窗口部件 1. QFrame 1.1 QLabel 1.2 QLCDNumber 1.3 QStackedWidget 1.4 QToolBox 2. QAbstractButton 2.1 ...

最新文章

  1. 这位年仅27岁的阿联酋人工智能部长,竟计划2117年火星造城,真是有钱帅气又任性!
  2. [ASM C/C++] C语言数组
  3. 解決 centos -bash: vim: command not found
  4. 关于码云的一些基本知识_一些关于 CPU 的基本知识
  5. vs 未能找到符号_意大利甲级赛事分析:尤文图斯vs卡利亚里
  6. 95-130-410-源码-source-RabbitMQ相关-RabbitMQ Connector
  7. Atitit alldiaryindex v1 t717 目录 1. Fix 1 2. Diary detail 1 2.1. Diary 1987---2016.12 1 2.2. Diary20
  8. Java内存模型基础知识
  9. 聚焦四个重组,构建基于IPD的卓越研发体系(3.0版)
  10. AppCrash explorer问题(解决方法)
  11. 如何区分电梯卡为id卡ic卡_门禁卡ID卡和IC卡从外表怎么区分?
  12. mysql的基础查阅
  13. 小程序ios页面数据空白问题
  14. 伤逝有感 文/江湖一剑客
  15. 奇特的锡纸海鲜小吃:吃到嗨都不会发胖的辣卤海鲜!值得开一家哦!
  16. wi7计算机如何查看隐藏的文件夹,win7隐藏的文件夹怎么显示?隐藏文件夹查看及设置方法...
  17. 埃森哲 X SAP:智慧转型高手论剑
  18. 6.网络基础-Network Monitor和Httpwatch工具
  19. 加入计算机网络协会申请书,大学生退出协会申请书
  20. miui android耗电快,你们的小米手机更新MIUI10之后耗电吗?试试这个方法解决吧

热门文章

  1. svn checkout 提示“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。”解决方法...
  2. javascript数组对象
  3. Opera Unite 用户指南
  4. Entity Framework 6.x Code First 基础
  5. java的第一个程序 ----Hello World
  6. Google的银河英雄传说
  7. ggsci | ggplot2的颜色标度拓展包(1):科研配色风格
  8. 安卓蓝牙键盘切换输入法_超薄无线蓝牙双模罗技K580键盘,自由切换享受打字快乐...
  9. 零基础学web前端难吗?新手该怎么学?
  10. HTTP请求Content-Type你知道是做什么的吗?