`
qimo601
  • 浏览: 3438080 次
  • 性别: 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,并在构造函数中...

    qtCustomPlugins:一组直接在QtDesigner中使用的自定义小部件

    【Qt Custom Plugins:在Qt Designer中使用自定义小部件】 Qt Custom Plugins是针对Qt Designer的扩展,它允许开发者创建并集成自己的自定义小部件到Qt Designer的UI设计环境中。这使得设计人员能够在可视化布局中...

    Qt5实现多窗口切换

    而`QWidget`是所有Qt GUI对象的基类,可以用来创建自定义的窗口或控件。如果你需要一个更轻量级的窗口,不包含额外的元素,可以选择`QWidget`。 2. **多窗口实例化**: 要实现多窗口,首先你需要为每个窗口创建一...

Global site tag (gtag.js) - Google Analytics