`
qimo601
  • 浏览: 3446270 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

【原创】Qt自定义窗口部件

    博客分类:
  • Qt
阅读更多

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_OBJECT

public:
    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_NAMESPACE

class 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_OBJECT
	Q_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 中就有你的自定义控件。

参考:



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

1
1
分享到:
评论

相关推荐

    QT自定义窗口边框

    在QT编程中,自定义窗口边框是一种...总之,QT自定义窗口边框是一个涉及到窗口管理、事件处理、图形绘制等多个方面的综合实践。通过学习和实践,开发者能够更好地掌握QT框架,为用户提供更加美观和个性化的界面体验。

    QT 自定义窗口

    1. **创建自定义窗口部件**:首先,你需要创建一个新的QWidget子类,这个子类将作为自定义标题栏的实现。在新的类中,你可以添加必要的控件,如关闭、最小化和最大化的按钮,以及窗口标题文本。 2. **布局管理**:...

    pmg.rar_QT 自定义窗口_qt custom_qt 窗口_qt 管理系统_人事管理系统

    在"pmg.rar"这个压缩包中,我们看到的是一个关于QT自定义窗口部件的实例,特别关注于QT的定制化窗口和管理系统,尤其是人事管理系统的应用。这涉及到几个重要的QT编程知识点,我会详细解释一下。 1. **QT自定义窗口...

    qt自定义界面放大缩小关闭

    总的来说,Qt自定义界面的放大、缩小和关闭涉及多个方面,包括绘图事件处理、窗口事件处理、布局管理和界面设计。熟练掌握这些技能,将使你在Qt开发中游刃有余。不断实践和学习,你的Qt之旅将会更加顺畅。

    Qt嵌入子Qt程序窗口到当前程序

    - 使用`QStackedWidget`:`QStackedWidget`可以作为容器,将多个窗口作为其子部件,通过`addWidget()`方法添加子窗口,并通过`setCurrentWidget()`来切换显示。 - 使用`QLayout`:通过`QVBoxLayout`或`QHBoxLayout...

    QT提示部件

    在QT框架下,我们可以利用窗口部件(QWidget)的特性来创建自定义的提示组件。QT是一个跨平台的C++图形用户界面库,提供了丰富的API和工具,使得开发者可以轻松地构建具有高级视觉效果的应用程序。 在这个实例中,...

    Qt自定义无边框窗体demo

    让我们一步步地解析这个“Qt自定义无边框窗体demo”。 首先,要创建一个无边框窗体,我们需要使用`QMainWindow`或`QWidget`作为基础类,并禁用其默认的边框。在Qt中,我们可以通过调用`setWindowFlags()`函数并传入...

    Qt 自定义导航窗口

    综上所述,创建一个“Qt自定义导航窗口”涉及到的关键知识点有:QWidget和QGraphicsView的使用、QIcon与资源管理、布局管理器(如QGridLayout)、事件处理(mouseMoveEvent)、QAction和槽机制,以及可能的QScroll...

    QT自定义toolbox

    QT自定义toolbox是一种在Qt开发环境中创建个性化工具箱控件的技术。在软件界面设计中,工具箱通常用于组织和展示各种功能按钮或模块,便于用户快速访问和操作。本教程将详细讲解如何在VS2015 + Qt5.9环境下实现一个...

    QT自定义仪表盘yibiaopan.zip

    QT自定义仪表盘是一种在软件开发中利用QT框架创建具有个性化和专业化显示效果的界面组件。QT是一个跨平台的应用程序开发框架,支持多种操作系统,包括Windows、Linux、macOS等。它提供了丰富的图形用户界面(GUI)...

    myWidget_qt自定义标题栏_qt自定义标题_mywidget_

    1. **创建自定义标题栏类**:首先,我们需要创建一个新的Qt小部件(QWidget)子类,例如`CustomTitleBar`,用于承载自定义标题栏的所有元素,如最小化、最大化、关闭按钮以及标题文本。 2. **布局管理**:在`...

    qt 自定义标签 窗口类创建

    在Qt中,可以使用QLayout管理窗口部件的布局。为了让自定义标签随窗口大小变化自适应,我们需要在父窗口中设置合适的布局,并确保`CustomLabel`正确处理大小变化请求。在`resizeEvent()`中添加相应代码: ```cpp ...

    QT-QWidget实现去除原边框,自定义边框(最大化、最小化、关闭按钮)、可拆分窗口部件、拖动窗体和缩放、样式表美化部件窗口

    QT_QWidget实现去除原边框,自定义边框(最大化、最小化、关闭按钮)、可拆分窗口部件(由用户使用时自由拖动部件尺寸)、拖动窗体和缩放(窗体四周都可以拉伸缩放)、样式表美化部件窗口、解决QMouseEvent触发事件...

    Qt无边框窗口体拖拽边框改变窗体大小终极方法(橡皮筋窗体)

    在Qt编程中,有时我们需要创建一个无边框的窗口,以实现自定义的界面效果,例如,我们可能希望用户能够通过拖动窗口的任意位置来改变窗口大小,就像橡皮筋一样自由伸缩。这就是所谓的“橡皮筋窗体”或“无边框窗口体...

    Qt 实现无边框窗口,支持缩放窗口大小

    要使无边框窗口看起来更专业,可以自定义窗口的边角样式和边缘效果,例如圆角或者阴影效果。这通常涉及到`QPainter`的使用,以及对`paintEvent`的重写。 6. **编译与运行** 使用QT5.8+MinGW编译Qt项目时,确保Qt...

    QT如何编写和使用自定义控件例程

    1. **继承Qwidget或其子类**:这是创建自定义控件的基础,通常我们会选择继承Qwidget或者它的子类(如QPushButton、QLabel等)来获得基本的窗口部件功能。例如,创建一个名为`MyCustomWidget`的类: ```cpp class ...

    Qt自定义控件-飞机航向角指示

    这个控件可以用于航空导航软件或者任何需要表示方向的项目,同时也为学习Qt自定义控件提供了一个实例。 首先,创建自定义控件通常需要继承自Qt提供的基础控件类。在这个案例中,我们可以选择继承自`QWidget`,因为...

    Qt 实现窗口大小过渡动画demo

    在实现窗口大小过渡动画时,我们通常会创建一个继承自QWidget的自定义窗口类,然后在这个类中添加动画效果。以下是一些关键步骤: 1. **创建自定义窗口类**:首先,创建一个新类,继承自QWidget,并在构造函数中...

    基于QT的多种自定义控件,包括IP地址输入框,日期时间滚动选择框等等

    综上所述,这个资源提供了一组实用的QT自定义控件,能够帮助开发者在创建应用程序时,为用户提供更加友好和专业的界面交互体验。通过学习和使用这些控件,开发者可以提升其在QT开发中的技能,创建出具有独特功能和...

    Qt自定义控件GridLayout

    在Qt框架中,自定义控件是开发人员为了满足特定需求而创建的具有特殊功能的可视化组件。在本例中,我们关注的是一个名为"GridLayout"的自定义布局控件。这个控件允许用户动态地添加、删除和管理网格中的元素,并且...

Global site tag (gtag.js) - Google Analytics