当前位置:网站首页>QT专题:自定义部件
QT专题:自定义部件
2022-08-02 09:29:00 【迷途君】
前面讲基础部件篇我们讲了一些qt给我们提供的基础部件,但当你的需求他提供的基础部件无法实现时我们基于上一篇讲到的事件机制,通过重写一些事件,来达成我们的需求,接下来我们通过两个例子来了解一下:
案例一:自定义按钮,让按钮按下去有一个动态反馈。
首先我们需要重写按钮,当他按下去,我们将按钮进行一个图案填充,那么很明显我们需要对鼠标点击事件和绘图事件进行重写,当点击鼠标后,我们执行绘画事件,将按钮填充图案,鼠标弹起后将信号重置,再执行绘图事件,但由于我们设置了条件判断,弹起后不会进行填充图案
mypushbutton.cpp
MYPushButton::MYPushButton(QString str, QWidget *parent) : QWidget(parent)
{
setMinimumSize(40, 20);//设置按钮最小尺寸
text = str;
bool isreleased = true;
}
//重写鼠标点击事件
void MYPushButton::mousePressEvent(QMouseEvent *event)
{
isreleased = false;
update();
//发射信号
emit clicked(true);
}
void MYPushButton::mouseReleaseEvent(QMouseEvent *event)
{
isreleased = true;
update();
}
void MYPushButton::paintEvent(QPaintEvent *event)
{
QPainter p(this);
//点击鼠标后将按钮进行图案填充
if(!isreleased)
{
QBrush brh;
brh.setStyle(Qt::DiagCrossPattern);
p.setBrush(brh);
}
p.drawRect(0, 0, width()-3, height()-3);//画一个矩形当做按钮
p.drawText(width()/2, height()/2, text);
}
Widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
num = 0;
bt = new MYPushButton("加一下");//使用我们自定义的按钮
lcd = new QLCDNumber;
lcd->setMinimumHeight(50);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(lcd);
vbox->addWidget(bt);
setLayout(vbox);
connect(bt, SIGNAL(clicked(bool)), this, SLOT(add_num() ));
}
看看效果吧:
我们点击过后
松开之后按钮就会恢复原样,实现一个点击的动态效果!!
案例2:自定义滑杆部件,实现滑动过程,数码管数字随着增加的效果
很明显既然要实现滑动效果我们首先要重写绘图事件,给我们画一条线,和一个滑动按钮,并且我们需要捕获鼠标移动的事件和鼠标点击的事件进行重写
myslider.cpp
#include "myslider.h"
#include <QPainter>
#include <QMouseEvent>
MYSlider::MYSlider(QWidget *parent) :
QWidget(parent)
{
setMinimumSize(100, 50);
}
void MYSlider::mouseMoveEvent(QMouseEvent *event)
{
pos = event->pos();
update();
}
void MYSlider::mousePressEvent(QMouseEvent *event)
{
pos = event->pos();
update();
}
void MYSlider::paintEvent(QPaintEvent *event)
{
//画杆儿
QPainter p(this);
p.drawLine(QPoint(0, height()/2), QPoint(width(), height()/2));
//画游标
QPainter p1(this);
QBrush brsh;
brsh.setStyle(Qt::SolidPattern);
p1.setBrush(brsh);
p1.drawEllipse(QPoint(pos.x(), height()/2), 30, 30);
emit valueChanged(pos.x()*100.0/width());
}
Myslider.h
#ifndef MYSLIDER_H
#define MYSLIDER_H
#include <QWidget>
class MYSlider : public QWidget
{
Q_OBJECT
public:
explicit MYSlider(QWidget *parent = nullptr);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
signals:
void valueChanged(int);//声明信号
private:
QPoint pos;
};
#endif // MYSLIDER_H
widget.cpp
#include "widget.h"
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
lcd = new QLCDNumber;//数码管
lcd->setMinimumHeight(50);
sdr = new MYSlider;//调用我们自定义的滑杆
// sdr->setOrientation(Qt::Horizontal);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(lcd);
vbox->addWidget(sdr);
setLayout(vbox);
connect(sdr, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSlider>
#include <QLCDNumber>
#include "myslider.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
MYSlider *sdr;
QLCDNumber *lcd;
};
#endif // WIDGET_H
看看效果:
边栏推荐
- 理解JS的三座大山
- 【技术分享】OSPFv3基本原理
- 【微信小程序】本地服务页面案例实现
- spark:热门品类中每个品类活跃的SessionID统计TOP10(案例)
- 【新版干货书】深度伪造 (DeepFakes):创造,检测和影响
- 小程序云开发(十):渐变与动画
- Re22:读论文 HetSANN An Attention-based Graph Neural Network for Heterogeneous Structural Learning
- 剑指offer专项突击版第17天
- 软件exe图标变记事本或浏览器、360压缩打不开的几种应急解决方法
- State Management in Jetpack Compose
猜你喜欢
随机推荐
cococreator dynamically set sprite
Mistakes in Brushing the Questions 1-Implicit Conversion and Loss of Precision
自定义View实现波浪荡漾效果
不用Swagger,那我用啥?
tf中tensor的大小输出
AutoJs学习-AES加解密
向量组的线性相关性
The god-level Alibaba "high concurrency" tutorial "basic + actual combat + source code + interview + architecture"
ORBSLAM代码阅读
Jenkins--基础--6.1--Pipeline--介绍
大厂外包,值得拥有吗?
关于缓存数据的探讨
Worship, Alibaba distributed system development and core principle analysis manual
mysql连接池的实现
Pytorch's LSTM parameters explained
十、 网络管理
Have you ever learned about these architecture designs and architecture knowledge systems?(Architecture book recommendation)
The use of thread pool and analysis of ThreadPoolExecutor source code
Implementation of mysql connection pool
【新版干货书】深度伪造 (DeepFakes):创造,检测和影响