qt学习第三天
1)封装一个新的ui界面,提升到其他界面。从而做到不需要每次都制作同一个界面:
在项目内点击添加新文件->选择qt->qt设计师界面->选择一个界面模板->填写类名->完成添加。
之后在想要添加的界面中放入一个widget模块,对自制界面进行盛放,并点击提升提升。
此界面如下:
之后进行对界面进行完成的代码:
void(QSpinBox::*sigvaluechanged)(int)=&QSpinBox::valueChanged;//因为valueChanged为重载函数。
connect(ui->spinBox,sigvaluechanged,ui->horizontalSlider,&QSlider::setValue);
connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
QPushButton *p=new QPushButton(“按钮”,this);//按钮进行实时的显示slider和spinbox的值。
p->move(40,10);
p->resize(30,30);
QTextEdit *q=new QTextEdit(“123”,this);
q->resize(100,30);
connect(p,&QPushButton::clicked,q,[=]{
q->setText(QString::number(ui->spinBox->value()));
});
****只有mainwindow才有工具栏状态栏。
2)label的操作,例如鼠标进入,鼠标离开,鼠标按下,鼠标移动,定时器等。
小知识点:
字符串的拼接:例如QString str=QString("%!%2%3").arg(1).arg(“2112”).arg(‘a’);
输出为12112a
%1对应第一个arg如果%1放到第三个位置
输出为2112a1
%!%2%3为占位符
常用代码:
#include "mylabl.h"
#include"QLabel"
#include"QMouseEvent"
#include"QTimer"
MyLabl::MyLabl(QWidget *parent) : QLabel(parent)
{
p=new QLabel("123",this);
p->resize(100,100);
p->setFrameStyle(QFrame::Box);
this->setMouseTracking(true);//qt自动不追踪
id=startTimer(100);//第一种定时器利用回调函数,不需要自己调用,如果有两个定时器就会造成回调函数再判断
QTimer *time=new QTimer(this);
time->start(100);//第二种定时器
connect(time, &QTimer::timeout, this, [=]()//每次100秒到了才进行记时间
{
static int number = 0;
this->setText(QString::number(number++));
});
}
void MyLabl::leaveEvent(QEvent *event)
{
p->setText("离开");
}
void MyLabl::enterEvent(QEvent *event)
{
p->setText("进入");
}
void MyLabl::mousePressEvent(QMouseEvent *event)
{
QString btn;
if(event->button() == Qt::LeftButton)
{
btn = "LeftButton";
}
else if(event->button() == Qt::RightButton)
{
btn = "RightButton";
}
else if(event->button() == Qt::MidButton)
{
btn = "MidButton";
}
QString str = QString("MousePree[%3]:(%1, %2)").arg(event->x()).arg(event->y()).arg(btn);
setText(str);
}
void MyLabl::mouseMoveEvent(QMouseEvent *ev)
{
QString btn;
if(ev->buttons() & (Qt::LeftButton | Qt::RightButton))
{
btn = "LeftButton";
}
else if(ev->buttons() & Qt::RightButton)
{
btn = "RightButton";
}
else if(ev->buttons() & Qt::MidButton)
{
btn = "MidButton";
}
QString str = QString("MouseMove[%3]:(%1, %2)").arg(ev->x()).arg(ev->y()).arg(btn);
setText(str);
}
void MyLabl::timerEvent(QTimerEvent *event)
{
// static int num=0;
// if(num==100)
// {
// killTimer(id);
// }
// else{
// num++;
// setText(QString::number(num));
// }
}
3)绘图的工具
画图类:Qpainter
QImage Qpixmap图片 Qpicture不是图片
Qimage不依赖于平台。
Qpixmap依赖于平台
Qpicture(1)只是一个绘图设备1.只保存绘图步骤(一堆数据)2.不是图片二进制文件3.不依赖于平台。
QBitmap是黑白图片,它的父类是Qpixmap
void paintEvent(OPaintEvent *)
1.它是回调函数
2.此函数不需要用户调用,再刷新时自动调用。
什么为刷新?
1.窗口显示的时候
2.最大化最小化的时候
3.窗口被遮挡重新显示的时候
4.用户强制刷新的时候
3.如果使用画家类,一定要在paintEvent函数中完成。
Qpainter p(this)其中this不是父类,而是指定画图设备
联系代码:
#include "widget.h"
#include "ui_widget.h"
#include"QPaintEvent"
#include"QPainter"
#include"QPoint"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
a=new QPushButton("移动",this);
a->move(100,100);
a->resize(50,50);
connect(a,&QPushButton::clicked,this,[=]{
update();
});
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *a)
{
#if 0
QPainter p(this );
p.drawPixmap(0,0,QPixmap(":/Image/xks.png"));//画一张图片
QPen pen;
pen.setColor(QColor(100,100,100));//设置笔的颜色,里面也可以写参数例如QT::green
pen.setWidth(10);//设置笔宽
pen.setStyle(Qt::DashLine);//还有其他几种类型
p.setPen(pen);//p重新设置画笔
p.drawLine(QPoint(100,100),QPoint(50,50));//画线
p.drawEllipse(QPoint(50,50),50,50);//画椭圆
QBrush brush(Qt::blue);//定义蓝色画刷
brush.setTextureImage(QImage(":/Image/face.png"));
p.setBrush(brush);//p的画刷设置为蓝色也可以刷图片
p.drawRect(100,100,150,150);//画矩形
QRect q(100,100,200,200);//设置矩形
// p.drawRect(q);
QRect array[2]={q,QRect(100,100,300,300)};//设置矩形数组
p.drawRects(array,0);//画一个数组的矩形,后面一个int类型数代表个数,画到数组第几个
pen.setColor(QColor(0,0,0));
p.setPen(pen);
QFont font("正楷",48,75,true);
p.setFont(font);
p.drawText(100,100,"哈哈哈哈哈哈");
#endif
QPainter p(this );
int static x=20;
x+=5;
if(x>this->width())//this->width()为当前窗口的宽度
{
x=20;
}
p.drawPixmap(x,100,QPixmap(":/Image/Luffy.png"));//画一张图片
}
4)利用Qpicture,Qpixmap,Qimage绘图,并保存
练习代码如下:
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPicture>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//Qpixmap中画图
QPixmap pix(300,300);//纸的大小
pix.fill(Qt::green);
QPainter p(&pix);//pix为画图设备
p.setPen(QPen(QColor(150,150,150),10));
p.drawLine(100,100,50,50);
p.drawEllipse(150,150,50,50);
pix.save("D:\\mypixmap.png");
// 指定绘图设备 1. 构造函数中(参数是绘图设备)
// 2. begin(参数是绘图设备)
// end();
// 在QImage中画图
QImage img(300, 300, QImage::Format_RGB32); // 纸的大小
img.fill(Qt::red);
p.begin(&img);
p.setPen(QPen(Qt::green, 10));
p.drawRect(10, 10, 280, 280);
p.drawEllipse(150, 150, 50, 50);
p.end();
img.save("D:\\myImage.png");
// 在QPicture中画图
// 1. 保存的是绘图步骤 -- 画家类
// 2. 不是图片, 二进制文件(save保存生成的文件)
// 3. 不依赖平台
QPicture pic; // 纸的大小
p.begin(&pic);
p.setPen(QPen(Qt::green, 10));
p.drawRect(10, 10, 280, 280);
p.drawEllipse(150, 150, 50, 50);
p.end();
pic.save("D:\\mypic.aaa");
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
//p.drawPixmap(0,0,QPixmap("D:\\myImage.png"));
QPicture pic;
pic.load("D:\\mypic.aaa");
p.drawPicture(100,100,pic);
}
5)利用png图片显示出不规则界面
练习如下:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 加载图片
pix.load("D:\\sunny.png");
// 去掉边框
this->setWindowFlags(Qt::FramelessWindowHint);
// 设置背景透明
this->setAttribute(Qt::WA_TranslucentBackground);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
// 在窗口中将图片画出来
QPainter p(this);
p.drawPixmap(0, 0, pix);
}
void Widget::mousePressEvent(QMouseEvent *e)
{
if(e->button() == Qt::LeftButton)
{
// 求差值 左键按下的点 - 窗口坐上角的点坐标
pt = e->globalPos() - this->frameGeometry().topLeft();
}
else if(e->button() == Qt::RightButton)
{
// close windows
this->close();
}
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
// mvoe x , y 使用的屏幕坐标系
// e->x() , e->y() 窗口的坐标系 Widget
this->move(e->globalPos() - pt);
}
重要代码:
// 去掉边框
this->setWindowFlags(Qt::FramelessWindowHint);
// 设置背景透明
this->setAttribute(Qt::WA_TranslucentBackground);