当前位置:网站首页>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_Hwidget.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看看效果:


边栏推荐
- 李航《统计学习方法》笔记之k近邻法
- Have you ever learned about these architecture designs and architecture knowledge systems?(Architecture book recommendation)
- 腾讯T8架构师,教你学中小研发团队架构实践PDF,高级架构师捷径
- 日元疲软令游戏机在日本变身“理财产品”:黄牛大赚
- 带你认识40G单纤双向光模块-QSFP+ BiDi光模块
- 堪称神级的阿里巴巴“高并发”教程《基础+实战+源码+面试+架构》
- Navicat连接MySQL时弹出:1045:Access denied for user ‘root’@’localhost’
- RPA助你玩转抖音,开启电商运营新引擎
- Tencent T8 architect, teach you to learn small and medium R&D team architecture practice PDF, senior architect shortcut
- Daily practice of dynamic programming (2)
猜你喜欢
随机推荐
日元疲软令游戏机在日本变身“理财产品”:黄牛大赚
【New Edition】DeepFakes: Creation, Detection and Influence
typeinfo类型支持库学习
稳定币:对冲基金做空 Tether 的结局会是什么?
[Concurrent programming] - Thread pool uses DiscardOldestPolicy strategy, DiscardPolicy strategy
spark:热门品类中每个品类活跃的SessionID统计TOP10(案例)
HikariCP database connection pool, too fast!
mysql连接池的实现
Docker内MySQL主从复制学习,以及遇到的一些问题
向量组的线性相关性
单机部署flink,创建oracle19c rac的连接表时报错 ORA-12505 ,怎么回事?
AutoJs学习-实现科赫雪花
练习40,小蓝的旅行【最短路】
js引擎运行中的预解析(变量提升和函数提升)及相关实操案例
leetcode 62. Unique Paths(独特的路径)
每天花2小时恶补腾讯T8纯手打688页SSM框架和Redis,成功上岸美团
李航《统计学习方法》笔记之k近邻法
cococreator dynamically set sprite
PyQt5安装配置(PyCharm) 亲测可用
State Management in Jetpack Compose








