- List item
1.自定义控件的封装
1.1 控件封装与调用
//1.创建一个新的QT设计师界面类Form
//1.在Form的ui界面中,自定义组合控件Tool Box和Slider
//2.通过widget控件,将自定义控件进行封装
//2.在widget源文件中调用新控件
//1.ui界面中添加一个widget控件
//2.将该控件提升为Form类
//3.运行即可将Form类的组合控件当作widget类的控件输出
1.2控件的关联
//Slider随spinBox改变
void (QSpinBox::*change)(int) = &QSpinBox::valueChanged;
connect(ui->spinBox, change, ui->horizontalSlider, &QSlider::setValue);
//spinBox随Slider改变
connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);
1.3 设置/获取封装控件数值
//1.在Form类中定义设置/获取的成员函数
//1.设置spinBox的值
void Form::Changed()
{
ui->spinBox->setValue(50);
}
//2.获取spinBox的值
int Form::getvalue()
{
return ui->spinBox->value();
}
//2.在Widget类中调用组合控件接口
//1.调用组合控件的接口,获取值
connect(ui->pushButton, &QPushButton::clicked, this, [=]()
{
qDebug() << ui->widget->getvalue();
});
//2.调用组合控件的接口,设置值
connect(ui->pushButton_2, &QPushButton::clicked, this, [=]()
{
ui->widget->Changed();
});
2. 鼠标事件
//1.将建一个label控件用于挂载鼠标事件
//1.ui界面添加一个label控件
//2.创建一个Mylabel类
//3.将label控件提升为Mylabel类
//2.在Mylabel类中定义重写鼠标事件
//1.鼠标进入
void MyLabel::enterEvent(QEvent *event)
{
qDebug() << "鼠标进入";
}
//2.鼠标离开
void MyLabel::leaveEvent(QEvent *event)
{
qDebug() << "鼠标离开";
}
//3.鼠标点击
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
//1.若点击的是左键
if(ev->button() == Qt::LeftButton)
{
//2.打印点击的坐标
QString str = QString("鼠标点击 x = %1, y = %2").arg(ev->x(), ev->y());
qDebug() << str;
}
}
//4.鼠标释放
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
QString str = QString("鼠标释放 x = %1, y = %2").arg(ev->x(), ev->y());
qDebug() << str;
}
}
//5.鼠标移动
void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
//1.设置自动捕捉鼠标,无需判断是否点击
// this->setMouseTracking(true);
if(ev->buttons() & Qt::LeftButton)
{
QString str = QString("鼠标移动 x = %1, y = %2").arg(ev->x(), ev->y());
qDebug() << str;
}
}
3.定时器事件
//1.构造函数中启动定时器
//定时器的时间,传出定时器的id
m_id1 = startTimer(1000);
m_id2 = startTimer(500);
//2.重写定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
//1.根据定时器id判断是哪一个定时器
if(event->timerId() == m_id1)
{
//2.label控件的名字++
static int num = 0;
ui->label_2->setText(QString().number(num++));
}
if(event->timerId() == m_id2)
{
static int num = 0;
ui->label_3->setText(QString().number(num++));
}
}
4.定时器类
//1.创建定时器对象
QTimer *timer = new QTimer(this);
//2.启动定时器,并设置时间
timer->start(2000);
//3.时间到,产生timeout信号,定义槽函数
connect(timer, &QTimer::timeout, this, [=]()
{
static int num = 0;
ui->label_4->setText(QString().number(num++));
});
//4.时间停止
connect(ui->pushButton, &QPushButton::clicked, timer, &QTimer::stop);
//5.若想在创建一个定时器,就再创建一个定时器对象即可
5. event事件分发器
鼠标点击、移动、释放、定时器事件,其中有些手动触发有些自动触发
事件由谁触发?触发—APP—event事件分发器-事件处理函数
event事件分发器也可以重写,可以拦截部分发给事件处理函数,但不建议[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wFeIU1cI-1586254142016)(C:\Users\10139\AppData\Roaming\Typora\typora-user-images\1586139325688.png)]
/*创建事件分发器函数*/
bool MyLabel::event(QEvent *e)
{
//1.判断参数是否是要拦截的事件
if(e->type == 拦截的事件)
{
//2.若是,则执行相关逻辑,并返回ture
打印/输出等相关逻辑
return true
}
//3.将不拦截的事件交给父类处理
return QLabel::event(e);
}
6. 事件过滤器
在APP—事件分发器之间在做一层拦截,就是事件过滤器。
//1.给安装事件过滤器
ui->控件->installEventFilter(this);
//2.重写事件过滤函数
bool MyWidget::eventFilter(QObject *obj, QEvent *ev)
{
//1.判断控件是否要拦截的控件
if(obj == ui->控件)
{
//2.判断事件是否要拦截的事件
if(ev->type() == 拦截的事件)
{
//3.拦截事件处理逻辑, 并返回true
拦截事件处理逻辑;
return true;
}
}
//4.不拦截的交给父类
return QWidget::eventFilter(obj, ev);
}
7.绘图基本设置
绘图事件painterEvent事件,在窗体中用父类QWidget。
//1.重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
//this代表绘图的设置,让画家在当前的窗口中绘图
QPainter painter(this);
//2.设置画笔
//设置画笔
QPen pen(QColor(255, 0, 0));
//设置笔的宽度
pen.setWidth(3);
//设置笔的风格
pen.setStyle(Qt::SolidLine);
//让画家拿起画笔
painter.setPen(pen);
n
//3.设置画刷
//设置画刷 给封闭图案填充颜色
QBrush brush(Qt::green);
//画家拿起画刷
painter.setBrush(brush);
brush.setStyle(Qt::Dense2Pattern);
//4.进行画图
//划线
painter.drawLine(QPoint(0, 0), QPoint(100,100));
//画圆
painter.drawEllipse(QPoint(100, 100), 50, 50);
//画矩形
painter.drawRect(QRect(50, 50, 50, 50));
//画文字
painter.drawText(QRect(10, 200, 100, 50), "好好学习,天天向上");
}
8.绘图的高级设置
//抗锯齿效果, 效果好,效率低
painter.drawEllipse(QPoint(100, 100), 50, 50);
painter.setRenderHint(QPainter::Antialiasing);
painter.drawEllipse(QPoint(250, 100), 50, 50);
painter.drawRect(QRect(20, 20, 50, 50));
//移动画家坐标
painter.translate(100, 0);
//保存状态
painter.save();
painter.drawRect(QRect(20, 20, 50, 50));
painter.translate(100, 0);
//读取状态
painter.restore();
painter.drawRect(QRect(20, 20, 50, 50));
9. 绘制图片
9.1 绘制图片
//1.添加QT图片资源
//2.调用成员函数,将图片添加
painter.drawPixmap(m_posx, 0, QPixmap(":/Image/Luffy.png"));
9.2 点击按钮移动图片
//1.创建按钮
//2.将按钮信号与移动图片坐标函数想关联
connect(ui->pushButton, &QPushButton::clicked, this, [=]()
{
m_posx += 10;
//1.判断移动的坐标是否还在当前窗口中
if(m_posx > this->width())
{
m_posx = 0;
}
//2.手动调用绘图时间
update();
});
10. Qfile读文件
//点击打开,创建对话框打开文件
connect(ui->pushButton, &QPushButton::clicked, this, [=]()
{
//1.显示路径
//1.创建一个对话框
QString ret = QFileDialog::getOpenFileName(this, "打开文件", "F:\\03-绘图与文件操作\\Doc", "(*.txt)");
//2.显示内容
ui->lineEdit->setText(ret);
//2.显示路径
//1.创建文件对象
QFile file(ret);
//2.打开文件
file.open(QIODevice::ReadOnly);
//3.读取内容
QByteArray arr = file.readAll();
//4.显示内容
ui->textEdit->setText(arr);
//5.关闭文件
file.close();
//3.写文件
file.open(QIODevice::Append);
file.write("啊啊啊啊啊");
//5.关闭文件
file.close();
//4.获取文件信息
//1.创建文件信息对象
QFileInfo info(ret);
//2.获取文件信息
qDebug() << "后缀名:"<<info.suffix() << "文件名:"<<info.fileName()
<< "文件路径:"<<info.filePath()<<"文件大小:"<<info.size();
//3.获取时间
qDebug() <<"创建日期:" << info.created().toString("yy/MM/dd hh:ss:ss");
});
11. 文件信息qfileinfo类
.获取文件信息
//1.创建文件信息对象
QFileInfo info(ret);
//2.获取文件信息
qDebug() << “后缀名:”<<info.suffix() << “文件名:”<<info.fileName()
<< “文件路径:”<<info.filePath()<<“文件大小:”<<info.size();
//3.获取时间
qDebug() <<“创建日期:” << info.created().toString(“yy/MM/dd hh:ss:ss”);
});
### 11. 文件信息qfileinfo类
```cpp