门户网站建设使用语言,桂林小学网站建设,百度竞价开户流程,wordpress 首页静态页面第三天#xff1a;
自定义控件#xff0c;事件处理器⭐#xff0c;定时器#xff0c;QPainter,绘图设备#xff0c;不规则窗口实现
1.自定义控件#xff1a;
创建新的QT控件类#xff0c;然后再需要使用的地方--》提升为 来使用如何使用基础控件的信号和槽函数
自定义控件事件处理器⭐定时器QPainter,绘图设备不规则窗口实现
1.自定义控件
创建新的QT控件类然后再需要使用的地方--》提升为 来使用如何使用基础控件的信号和槽函数一个改变另外一个也跟着进行改变重点已知类帮助文档查找信号和槽或函数
//使用信号槽来完成功能//调节数字控件则横向的数值会跟着变动//QSpinBox::valueChanged有函数重载需要使用指针的形式void (QSpinBox::*SigValueChange) (int) QSpinBox::valueChanged;connect(ui-spinBox,SigValueChange,ui-horizontalSlider,QSlider::setValue);//调节横向数值数字控件会跟着移动connect(ui-horizontalSlider,QSlider::valueChanged,ui-spinBox,QSpinBox::setValue);2.事件处理器
以鼠标事件为例键盘和其他事件类似 创建一个MyLabel类继承自QLabel类在其帮助文档的可重写函数中或者其基类中找需要的事件函数然后进行重写。以鼠标进入鼠标离开鼠标按下定时器其本质是回调函数不用我们自己调用只需要重写条件满足会自动调用
public:explicit MyLabel(QWidget *parent 0);//继承自一个窗口类protected://是受保护的成员变量在QLabel的基类QWidget中可以找到该函数//鼠标进入void enterEvent(QEvent *);//鼠标离开void leaveEvent(QEvent *);//鼠标按下void mousePressEvent(QMouseEvent *event);//定时器void timeEvent(QTimerEvent *);//要注意要加:QLabel(parent)要不然无法显示
MyLabel::MyLabel(QWidget *parent):QLabel(parent)
{this-setText(hello);
}
void MyLabel::enterEvent(QEvent *)
{setText(enterEvent);
}void MyLabel::leaveEvent(QEvent *)
{setText(leaveEvent);
}void MyLabel::mousePressEvent(QMouseEvent *ev)
{//从帮助文档中可查看QMouseEvent的使用if(ev-button() Qt::LeftButton ){setText(mousePressEvent:Qt::LeftButton!);}
}3.定时器
方法a:重写定时器事件函数
//定时器
void timerEvent(QTimerEvent *);//每触发一次定时器都进入该函数中
void MyLabel::timerEvent(QTimerEvent *)
{static int num 0;QString str QString(%1).arg(num);setText(str);if(num 100){killTimer(timeID); //根据定时器开始时的返回ID去关闭定时器}}启动定时器此处启动在构造函数中
MyLabel::MyLabel(QWidget *parent):QLabel(parent)
{this-setText(hello);//启动定时器timeID startTimer(100);//每隔100ms启动一次
}方法b:添加QTimer类创建对象在计时到之后会发出信号使用信号槽进行处理。推荐这种写法
//第二种定时器QTimer *timer1 new QTimer(this);timer1-start(100);//100ms触发一次//timer1发出了信号创建槽函数进行接收connect(timer1,QTimer::timeout,this,[](){static int number;this-setText(QString::number(number));});4.QPainter绘图和QPaintDevice(QPixMap,QBitmap,QImage,QPicture)绘图设备
a.需要绘图先添加绘图类QPainter然后需要重写虚函数
#include QPainter
.......
protected://1.虚函数可重写//2.回调函数不需要用户去主动调用在刷新窗口的时候会自动调用窗口显示最大化最小化窗口被遮挡重新显示时用户强制刷新...//3.如果想使用画家类在窗口中画图操作必须在paintEvent函数中完成void paintEvent(QPaintEvent *event) ;......
void Study_Painter::paintEvent(QPaintEvent *event)
{//绘图类重写虚函数绘图事件//创建画家类对象QPainter p(this); //指定绘图设备--》在this当前窗口中画//根据提示帮助文档写参数及其类型//画背景图p.drawPixmap(0,0,QPixmap(D://321.jpg));//画直线p.drawLine(QPoint(200,200),QPoint(300,300));}显示结果 创建画笔更改颜色等功能-----轮廓 QPen pen;pen.setColor(QColor(0,255,100));pen.setWidth(10);p.setPen(pen); //将设置的pen传入给QPainter画家然后再使用画家P进行画图操作p.drawPie(QRect(100,100,20,20),20,20);创建画刷类QBush(闭合区域可使用画刷)使用方式跟QPen类似p.setBrush(…) 字体QFont类使用方式也类似创建之后加入到画家类中p.setFont(…)
paintEvent重载后用户如何强制刷新界面update();
void Study_CarManager::paintEvent(QPaintEvent *event)
{QPainter p(this);//添加x 5;p.drawPixmap(x,100,QPixmap(D://myheart.png));if(x this-width()){//如果突破图片边界则返回x 20;}
}在构造函数中检测到按钮按下则移动图片位置强制刷新 x 200;//注意在.h文件中和刷新//按下按钮刷新图片位置connect(ui-pushButton,QPushButton::clicked,this,[](){update(); //用户强制主动刷新使用update会调用paintEvent});
5.QPaintDevice(QPixMap⭐,QBitmap,QImage,QPicture)绘图设备
主要使用QPixmap来显示图片他针对于显示器显示做了特殊优化,依赖于平台只能在主线程中使用UI线程 QImage图片类不依耐平台可以在多线程中对其进行操作 使用方法绘图设备画家类画笔 //绘图设备画图QImage是类似的QPixmap pix(300,300); //纸张的大小pix.fill(Qt::red);QPainter p(pix); //创建画家类在绘图设备上作画//p.begin(pix); //如果之前有画家类则可使用begin函数更改绘图设备p.setPen(QPen(Qt::green)); //为画家类创建画笔提供使用p.drawRect(10,10,280,280);pix.save(D://mypixmap.png);而QPicture只是保存的二进制文件不是一个图片保存的是绘图步骤但是可根据QPicture的load函数传入一张之前保存的步骤图然后drawPicture可正常绘图可进行加密。
6.绘制不规则窗口
怎样做一个不规则的窗口边框去掉背景设为透明则只看见不透明的图片部分
//在.h中
//1.把绘图设备设为全局可用
QPixmap pix; //绘图设备
//2.重写绘图函数
protected:void paintEvent(QPaintEvent *event) ;//.cpp中
//1.在构造函数中加载所需图片
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);//1.加载图片,需要背景是透明的pix.load(D://myheart.png);//2.去掉窗口边框this-setWindowFlags(Qt::FramelessWindowHint); //窗口设置//3.设置背景透明this-setAttribute(Qt::WA_TranslucentBackground);
}//2.在paintEvent中使用画家类进行图片刷新
void Widget::paintEvent(QPaintEvent *event)
{//在窗口中把图片画出来QPainter p(this);p.drawPixmap(0,0,pix); //把绘图设备导入画家类
}
效果 如果需要跟随鼠标移动或者鼠标右键关闭窗口则在加入鼠标的事件处理器重写对应的事件函数例如mousePressEventmouseMoveEvent等则可。【需注意坐标点的转换】