自定义Qt窗口部件

实现一个十六进制的SpinBox,一般SpinBox只支持十进制整数,但是可以子类化方法实现该功能
需重新实现以下虚函数
virtual QString	textFromValue ( int value ) const
virtual int valueFromText ( const QString & text ) const

例如:(摘抄自QtAssitant)

 int IconSizeSpinBox::valueFromText(const QString &text) const
{
QRegExp regExp(tr("(\\d+)(\\s*[xx]\\s*\\d+)?")); if (regExp.exactMatch(text)) {
return regExp.cap(1).toInt();
} else {
return 0;
}
} QString IconSizeSpinBox::textFromValue(int value) const
{
return tr("%1 x %1").arg(value);
}

自己实现hexspinBox的代码

#ifndef HEXSPINBOX_H
#define HEXSPINBOX_H #include <QSpinBox> class QRegExpValidator;
class hexspinBox : public QSpinBox
{
Q_OBJECT public:
explicit hexspinBox(QWidget *parent = 0);
~hexspinBox(); protected:
//重写基类函数
QValidator::State validate(QString &input, int &pos) const;
int valueFromText(const QString &text) const;
QString textFromValue(int val) const;
private:
QRegExpValidator *validator; }; #endif // HEXSPINBOX_H

//实现代码

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

子类化QWidget

当手里没有任何一个Qt窗口部件能够满足任何任务需求时,我们可以创建自己想要的窗口部件。要实现这一点,只需通过子类化QWidget,并且通过重新实现一些用来绘制窗口部件和相应鼠标点击的事件处理器即可

比如继承QWidget类
例如,创建一个可以改变区域颜色的简单图形界面程序
先让主类继承QWidget,在重写需要自己实现的虚函数,如下面的 mousePressEvent , mouseMoveEvent, paintEvent
class IconEditor : public QWidget
{
Q_OBJECT
//声明类的属性
Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor)
Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage)
Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor) public:
explicit IconEditor(QWidget *parent = 0);
~IconEditor(); void setPenColor(const QColor &newColor);
QColor penColor() const { return curColor; }
void setZoomFactor(int newZoom);
int zoomFactor() const { return zoom; }
void setIconImage(const QImage &newImage);
QImage iconImage() const { return image; }
QSize sizeHint() const; protected:
void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void paintEvent(QPaintEvent *); private:
void setImagePixel(const QPoint &pos, bool opaque);
QRect pixelRect(int i, int j) const; QColor curColor;
QImage image;
int zoom;
};

再依次实现类中的函数,与MFC中自绘控件是一回事。以下是cpp中部分代码

void IconEditor::paintEvent(QPaintEvent *event){
QPainter painter(this); if(zoom>=3){
painter.setPen(palette().foreground().color());
for(int i=0; i<=image.width(); i++){
painter.drawLine(zoom*i, 0,
zoom*i, zoom*image.height());
for(int j=0; j<=image.height(); j++){
painter.drawLine(0, zoom*j,
zoom*image.width(), zoom*j);
}
for(int i=0; i<image.width(); i++){
for(int j=0; j<image.height(); j++){
QRect rect = pixelRect(i, j);
if(!event->region().intersected(rect).isEmpty()){
QColor color = QColor::fromRgba(image.pixel(i, j));
if(color.alpha()<255)
painter.fillRect(rect, Qt::white);
painter.fillRect(rect, color);
}
}
}
}
}
}
void IconEditor::mousePressEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton){
setImagePixel(event->pos(), true);
} else if(event->button()==Qt::RightButton){
setImagePixel(event->pos(), false);
}
} void IconEditor::mouseMoveEvent(QMouseEvent *event){
if(event->buttons() & Qt::LeftButton){
setImagePixel(event->pos(), true);
} else if(event->buttons() & Qt::RightButton){
setImagePixel(event->pos(), false);
}
}



程序运行截图:


Qt学习之自定义窗口部件的更多相关文章

  1. 【Qt学习笔记】窗口部件整理

    关于Qt中窗口部件的学习 今天开始学习Qt的窗口部件,领略一下Qt的神奇之处,记得2012年的那年冬天,我还学Java呢,现在基本上和Java说再见了,不过对于嵌入式的开发Qt还是举足轻重的,我想趁着 ...

  2. Qt入门(19)——自定义窗口部件

    我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange().        void setRange( int minVal, int maxV ...

  3. Qt自定义窗口部件

    QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)   改进法   1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...

  4. C++ GUI Qt4编程-创建自定义窗口部件

    C++ GUI Qt4编程-创建自定义窗口部件   Qtqt4 通过Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件,下面示范两种方式,并且也会说明如何把自定义窗口部 ...

  5. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)

    1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...

  6. QT笔记之自定义窗口拖拽移动

    1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...

  7. PyQt(Python+Qt)学习随笔:窗口layout布局的SizeConstraint和部件的大小约束策略sizePolicy不起作用的问题

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在写一个测试代码时,发现无论怎么设置窗口以及子部件 ...

  8. PyQt(Python+Qt)学习随笔:QWidget部件的palette属性以及ColorGroup、colorRole的用途和含义

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 1.palette属性 QWidget部件的palette属性用于控制 ...

  9. QT5中如何自定义窗口部件

    提升法 eg.(定义一个新的QLable部件)1.定义一个类class Label : public base, public QLabel //可以支持多重继承2.在qt creator中打开ui编 ...

随机推荐

  1. dzzoffice教程、文档、开发手册等内容地址

    dzzoffice教程.文档.开发手册等内容全部都存放在DzzOffice开发者社区的文集中.搜索引擎收录不到DzzOffice中的应用内容,这里将文集地址提供在这里. 地址:http://dev.d ...

  2. collect my database for test KCF tracker tools

    Path Button used to set dir where avi file saves, set path set video size and start record write to ...

  3. 求职基础复习之冒泡排序c++版

    代码中在第一层循环中增加一个bool值,是为了防止在排序完成后还继续无谓的比较,最多会有(n-1)*(n-2)/2次循环. #include<iostream> using namespa ...

  4. ps教程-三分钟画齿轮

  5. Scrum流程

    敏捷Scrum流程图: Sprint Planing Meeting: 1.Next Spring Goal; 2.Sprint Backlog; 3.Updated Product Backlog; ...

  6. 类的大小——sizeof 的研究

    类的大小——sizeof 的研究(1) 先看一个空的类占多少空间? class Base { public: Base(); ~Base(); }; 注意到我这里显示声明了构造跟析构,但是sizeof ...

  7. nova service-list

    nova-scheduler start/running, process 4820root@ruiy-controller-a:/var/log/nova# nova service-list+-- ...

  8. JQuery实现的动态Table(转)

    这个例子做的不错,转载备份. 原文:http://www.cnblogs.com/linjiqin/archive/2013/06/21/3148181.html $("#mytable t ...

  9. WebRTC源码分析:音频模块结构分析

    一.概要介绍WebRTC的音频处理流程,见下图: webRTC将音频会话抽象为一个通道Channel,譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输.上图中有三个Chann ...

  10. 【破解三网】iphone5 国行 A1429

    教程仅适用于A1429的I5. 1.首先把sim卡插入手机.关闭蜂窝数据里面的"蜂窝移动数据"还有打开漫游里面的"语音漫游".如图               ...